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

Nop*_*you 1 c arrays pointers

我有一个函数,我将一个数组传入我的main函数和一个int.我正在对这个新函数中的数组进行操作,让我们称它为foo.在foo中,我初始化另一个数组,其中52个单元都是0.我对从main传递的数组执行操作,并将该数据传输到新初始化的数组.我想将新数组返回给main函数.但是,当然,我无法返回数组之类的数据结构.所以我改为返回一个指向这个数组的int指针.在int main中,我传递指针使其指向数组中的各个单元格.当我打印指针指向的结果时,它应该指向0或大于0的整数.但相反,我得到不一致的结果.出于某种原因,一些应该为0的值打印出垃圾数据.我一直试图发现这个bug已经有一段时间了,但我只是想看看它.这里只是对这部分代码的一般想法......

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;
}
Run Code Online (Sandbox Code Playgroud)

希望这能理解我正在努力做的事情.在foo函数中,我试图找到某些字母的频率.我知道这可能有点神秘,但代码很长,有评论和一切所以我想尽可能简洁.有没有可能的原因我为某些(数字> 0,0)和另一部分的垃圾值得到正确的值?

Emi*_*röm 6

你得到垃圾回来的原因是创建的数组foo是在foos堆栈框架中分配的,然后你将指针返回到那个框架.foo返回时丢弃该帧.

如果要在foo返回后保留数组,则应在堆上分配数组(使用malloc和friends).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;
}
Run Code Online (Sandbox Code Playgroud)

另一种方法是让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
}
Run Code Online (Sandbox Code Playgroud)

这个工作的原因是因为数组与指针完全相同,所以你实际上是通过引用传递数组foo.arr将指向同一个地方ret,进入堆栈框架main.