gpt4 book ai didi

C语言用Malloc修改数组

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

void helperWithoutMalloc(int *arr) {
arr[0] = 18;
arr[1] = 21;
arr[2] = 23;
}

int main() {
int *data;
helperWithoutMalloc(data);

printf("%d\n", data[0]);
return 0;
}

上述方法通过helperWithoutMalloc()方法成功修改了data的值;但是,当应用 malloc 方法时;类似的方法不起作用。数据数组中的三个值仍然为零

void helperNotWorking(int *arr) {
arr = malloc(sizeof(int)*3);
arr[0] = 18;
arr[1] = 21;
arr[2] = 23;
}
int main() {
int *data;
helperNotWorking(data);

printf("%d\n", data[0]);
return 0;
}

我只是想知道当执行行 arr = malloc(sizeof(int)*3) 时会发生什么;并使两个代码如此不同?

主要的困惑是:第一个代码不管它的错误,仍然可以修改数组元素,而第二个代码,不能修改数组元素;因为这两个函数都传递数组的地址;我们通过地址操作数组元素

最佳答案

与任何其他语言一样,C 中的任何数据结构都必须提供一个可以保存数据的内存区域。在您的第一个示例中,您没有这样做。 “数据”指针未指向任何内存并已初始化。它偶然起作用,你只是让你的程序在某处写入数据,而这恰好是可写的。你需要像下面这样的东西:

int main() {
int data[3]; // allocate an array for data
helperWithoutMalloc(data);

在上面的示例中,内存由 3 个元素的 C 数组提供。

以类似的方式,您可以使用 malloc:

int main() {
int *data = malloc(sizeof(int) * 3);
helperWithoutMalloc(data);

请注意,数据空间是在调用该函数并传递给它之前分配的。该函数可以使用指针(内存地址)访问数组元素。

在您的第二个示例中,您犯了一个不同的错误。您分配了空间,但是您将指针分配给了函数的参数。您案例中的指针是按值传递给您的函数的,因此它是单向的。您可以将它传递给函数,但不能向后传递。它在函数内部运行良好,但它没有更新“数据”,因此您无法在从函数返回后访问这些值。有几种方法可以解决它。 IE。你可以从函数返回你的指针:

int *helper() {
int *arr = malloc(sizeof(int)*3);
...
return arr;
}
int main() {
int *data = helper();
...

或者您可以使用指向指针的指针传递给函数:

 void helper(int **arr) {
*arr = malloc(...)
(*arr)[0] = 0;
...
}

int main () {
int *data;
helper(&data);

关于C语言用Malloc修改数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46396451/

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