【发布时间】:2017-09-25 01:31:31
【问题描述】:
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) 行时会发生什么;并使两个代码如此不同?
主要的困惑是:第一个代码不管它的错误,仍然可以修改数组元素,而第二个代码,不能修改数组元素;因为这两个函数都传递了数组的地址;我们通过地址来操作数组元素
【问题讨论】:
-
您正在函数内部执行 malloc() 。数据在那里分配,但指针没有返回给调用函数。因此分配的内存会丢失(这是内存泄漏!)。要修复,请从调用函数(main)执行 malloc。此外,您很幸运,您的第一个示例有效,因为您没有为其工作分配内存。它可能会在某些平台上崩溃。
-
@TheGreatContini 你是这个意思吗?当调用 malloc 时,我实际上成功地修改了 helperNotWorking(); 中的数组;但因为它不返回指针;所以一旦我离开了 helperNotWorking(),我就无法访问存储在堆中的修改后的值?
-
@ElleryL 正确!
-
这些都是未定义的行为
-
这段代码都不正确。第一个版本正在写入未初始化的指针。有时它可能会“工作”,但它会破坏您的运行时环境,并且可能会在未来导致明显的问题。第二个版本分配一个数组,写入它,然后有效地丢弃指针。为什么不返回指针以便调用者可见?
标签: c