我有一个函数,我将一个数组传入我的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)和另一部分的垃圾值得到正确的值?
你得到垃圾回来的原因是创建的数组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.