c - 指向接收不需要的垃圾值的单独函数中的数组的指针

标签 c arrays pointers

我有一个函数,我将一个数组传递给它,并将一个整数从我的主函数传递给它。我正在这个新函数中对数组进行操作,我们称它为 foo。在 foo 中,我用 52 个单元初始化另一个数组,所有单元都为 0。我对从 main 传递的数组进行操作,并将该数据传输到新初始化的数组。我想将新数组返回给主函数。但是当然,我不能返回像数组这样的数据结构。所以我改为返回一个指向这个数组的 int 指针。在 int main 中,我传递指针以使其指向数组中的各个单元格。当我打印指针指向的结果时,它应该指向 0 或大于 0 的整数。但是,我得到的结果却不一致。出于某种原因,一些应该为 0 的值会打印出垃圾数据。一段时间以来,我一直试图找出这个错误,但我只是想再看看它。无论如何,这只是这部分代码的一般想法......

int main(){
    int *retPtr;
    char input[] = "abaecedg";
    retPtr = foo(input, size);
    for(i=0; i<52; i++){
        // error displayed here
        printf("%d\n", *(retPr + i));
    }
}

int foo(char input[], int size)
{
    int arr[52] = {0};      // should initialize all 52 cells with 0.
    int i=0, value;         // looking for non-zero results in the end.        
    int *ptr = &arr[0];                        
    for(i=0; i<size; i++){
        if(arr[i] > 64 && arr[i] < 91){
            value = input[i] - 65;
            arr[value]++;
        }
    }
    return ptr;
}

希望这能理解我正在尝试做的事情。在 foo 函数中,我试图找到某些字母表的频率。我知道这可能有点神秘,但代码很长,有注释和所有内容,所以我想让它尽可能简洁。是否有任何可能的原因导致我为某些(数字 > 0、0)获得正确的值而在另一个中获得垃圾值?

最佳答案

返回垃圾的原因是在 foo 中创建的数组分配在 foos 栈帧中,然后您返回指向该帧的指针。当 foo 返回时,该帧被丢弃。

如果您希望它在 foo 返回后保留,您应该在堆上分配数组(使用 malloc 和 friend )。完成数组后,不要忘记 free() 它。

int main(){
    char input[] = "abaecedg";
    int retPtr[] = foo(input, size); //An array and a pointer is the same thing
    ...
    free(retPtr);
}

int *foo(char input[], int size)
{
    int arr[] = calloc(52*sizeof(int); // should initialize all 52 cells with 0.
    ...
    arr[value]++;
    ...
    return arr;
}

另一种方法是让 foo 将一个数组作为参数并使用它,以这种方式:

int main(){
    int ret[52] = {0};
    ...
    foo(input, size, ret);
    ...
}

void foo(char input[], int size, int *arr)
{
    ...
    arr[value]++;
    ...
    return; //Don't return anything, you have changed the array in-place
}

之所以可行,是因为数组与指针完全相同,因此您实际上是通过引用将数组传递给 fooarr 将指向与 ret 相同的位置,进入 main 的堆栈帧。

关于c - 指向接收不需要的垃圾值的单独函数中的数组的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13667267/

相关文章:

c - 在用户空间程序中请求定时器中断?

java - 显示 NullPointerException 的自定义类数组

C String数组的数组

c - 分配适当的变量以使这些声明正确

c - 如何正确地将输入扫描到 C 中的结构中并将其显示出来?

c - 为什么我的 Linux 应用程序每 0.5 秒停止一次?

c - 阻塞和解除阻塞 SIGINT 和 SIGQUIT

C Realloc 导致段错误

arrays - Postgres - 无法加入 UUID 上的 Json 数组值

c - 列表不断打印