如何为在C中作为参数传递的数组指针正确分配内存

问题描述 投票:0回答:2

我对自己的指针和引用感到困惑。我想在主函数中创建一个指针并将其设置为null。我想将该指针传递给另一个函数,该函数在堆上创建一个数组,填充该数组,然后返回创建的数组的大小。

我试图找到另一篇有关该主题的文章,但未能从该函数中找到分配内存的文章。下面的示例代码说明了这一概念,但我并未编写程序来完成任何特定任务。

int fillarray(/* pointer to an array */){

    // malloc the array to size n
    // fill array with n elements

return n;
}

int main(){

    int* array = NULL;
    int size = fillarray(/* pass the pointer by reference */);

    for(int i = 0; i < size; i++) printf("%d\n", array[i]);

    free(array);

return 0;
}

更新:

谢谢大家的评论。我学到了很多有关解决此问题的指针的知识。下面的代码完成了我所需要的。谢谢@Lundin。您的回答使我找到了实际的解决方案。谢谢@ssd。您的视觉效果使我对代码中的内容有了一些直觉。

int fillarray(int** array){

    *array = (int*)malloc(2 * sizeof(int));
    (*array)[0] = 0;
    (*array)[1] = 1;

return 2;
}

int main(){

    int* array = NULL;
    int size = fillarray(&array);
    for(int i = 0; i < size; i++) printf("%d\t", array[i]);

return 0;
}
c pointers reference heap
2个回答
2
投票

严格来说,C中没有“引用”,所有内容均按值传递。尽管术语“通过引用传递”与语言无关,并且实际上仅表示将地址传递给数据。 (C ++有一种称为引用的语言概念,但实际上只是美化了只读指针。)

因此,要实现所需的功能,必须传递指针本身的地址。这样,函数可以访问指针并将其设置为指向新地址。因此,将函数声明为int fillarray (int**),将函数声明为fillarray(&array)。需要将malloc的结果分配给指针指向指针的位置-它指向main()中声明的原始指针的地址。

至于分配可变大小,您必须为此在函数中添加一个附加的纯整数参数。


1
投票

我确实同意并同意Lundin's的答案,但为了更加概念化,我将在下面添加图形,因为我过去在理解指针时同样感到痛苦。

  • int *a)下面的第一个整数指针在内存地址4c4b40处,并且其值设置为零(这意味着该指针a设置为null)。

  • 第二个整数指针(int *b)位于存储器地址4c4b48,其值设置为4c4b58(这意味着该指针指向具有整数长度的存储器地址4c4b58)。如果该地址对应于变量int x = 16(十六进制10等于16),则取消引用指针b会得到16的整数值(*b = 16,因为x = 16)。

  • 第三个内存是另一个字符串指针,它指向下方的某个内存地址。

返回答案:

如果要更改第一个指针(a)的地址以指向变量x,则您正在调用的函数需要接收指针的地址(不是指针本身);即&a,而不是a,它对应于4c4b40。调用的函数将把地址4c4b40作为存储器地址接收,并将其值从000000更改为4c4b58。当然,函数修饰将包含一个int **。例如,如果整数指针是int *,则指向该指针的指针将是int **

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.