【发布时间】:2019-07-15 09:04:05
【问题描述】:
我正在尝试使用指针制作一段简单的 c 代码,但内存被意外覆盖。
我想创建一个指向整数的指针数组,然后创建一个指向整数的指针并将其地址分配给数组。
因此,数组将指向一个指向整数的指针。我在一个名为 add_value_to_array() 的函数中完成了这项工作。
这是我的代码:
void add_value_to_array(int *** array, int * value) {
*array = &value;
}
int main() {
int ** arr = { 0 };
int value = 5;
int * value_ptr = &value;
add_value_to_array(&arr, value_ptr);
//arr = &value_ptr;
printf("looool\n");
printf("looool\n");
printf("looool\n");
printf("looool\n");
printf("%p\n", arr[0]);
}
我想要的是:
arr -> value_ptr -> 5
(arr = &value_ptr
*array = value_ptr
value_ptr = &value
*value_ptr = 5
**arr = 5)
但是,这是我在调用 add_value_to_array() 之后所拥有的,但是当我调用 printfs() 时,内存被覆盖,我在 arr 变量中得到了垃圾值。
更奇怪的是,如果我直接使用arr = &value_ptr 而不是调用add_value_to_array,事情会按预期进行,并且内存不会被printfs() 覆盖。
因此,如果我使用函数或在函数之外执行操作,似乎内存分配不同。
我看到这种行为是怎么回事?
【问题讨论】:
-
数组在
c中不是动态的(您不能在c中向“内置”数组添加/删除新项目)。你也可以检查一下:stackoverflow.com/questions/3536153/c-dynamically-growing-array -
*array = &value;是失败的秘诀。value是该函数的自动变量。函数返回后它就不存在了,因此它的地址进入了以太。出于任何原因保存该地址几乎是在运行程序之前出现问题的迹象。
标签: c pointers pointer-to-pointer