我有一个函数,我将一个数组传递给它,并将一个整数从我的主函数传递给它。我正在这个新函数中对数组进行操作,我们称它为 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
}
之所以可行,是因为数组与指针完全相同,因此您实际上是通过引用将数组传递给 foo
。 arr
将指向与 ret
相同的位置,进入 main
的堆栈帧。
关于c - 指向接收不需要的垃圾值的单独函数中的数组的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13667267/