gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 00:39:50 25 4
gpt4 key购买 nike

我有一个函数,我将一个数组传递给它,并将一个整数从我的主函数传递给它。我正在这个新函数中对数组进行操作,我们称它为 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com