我无法理解一些 free() 行为。
int* ptr1 = (int*)malloc(sizeof (int)*10);
int* ptr2 = ptr1;
free(ptr2);
Run Code Online (Sandbox Code Playgroud)
是否free(ptr2)要按我的意愿删除我的数组?
如果我这样做怎么办:
int** ptr1 = (int**)malloc(sizeof (int)*10);
int* ptr2 = (int*)malloc(sizeof (int));
*ptr2 = 10;
ptr1[0] = ptr2;
free(ptr1);
Run Code Online (Sandbox Code Playgroud)
这段代码正确吗?会free(ptr1)也将删除PTR2的空间?
谢谢
分别是是和否。
另请注意,malloc(sizeof(int)*10);在第二个示例中可以工作,但它不一定会为十个指针分配空间。
为了解释第一个示例中发生的情况,在分配给ptr2您之后会出现如下内容:
+------+
| ptr1 | ----\
+------+ \ +----------------------------+
>---> | malloc | 分配的内存
+------+ / +----------------------------+
| ptr2 | ---/
+------+
两个变量都包含相同的值,即 所返回的指针malloc,因此您可以使用它们中的任何一个来访问分配的内存。
对于第二个问题,你所拥有的是这样的:
+---------+---------+---------+-----+ | ptr1[0] | ptr1[0] | ptr1[1] | ptr1[1] | ptr1[2] | ptr1[2] | ... | +---------+---------+---------+-----+ | | v +----------------------------------------+ | malloc | 分配的内存 +----------------------------------------+ ^ | | +------+ | ptr2 | +------+
当您释放指向 by 的内存指针时ptr1,仅释放该内存,由 指向的内存ptr2仍然存在并可通过 访问ptr2。
int* ptr1 = (int*)malloc(sizeof(int)*10);
int* ptr2 = ptr1;
free(ptr2);
Run Code Online (Sandbox Code Playgroud)
那很好,ptr2包含与 相同的值ptr1,因此您传递给的内存malloc()是free()d。
int** ptr1 = (int**)malloc(sizeof(int)*10);
int* ptr2 = (int*)malloc(sizeof(int));
*ptr2=10;
ptr1[0]=ptr2;
free(ptr1);
Run Code Online (Sandbox Code Playgroud)
那不好。您将 的值存储ptr2在ptr1数组中,但没有释放它。你要:
int** ptr1 = (int**)malloc(sizeof(int*)*10);
int* ptr2 = (int*)malloc(sizeof(int));
*ptr2=10;
ptr1[0]=ptr2;
...
free(ptr1[0]);
free(ptr1);
Run Code Online (Sandbox Code Playgroud)
请注意,我还更改了malloc()将 10 个指针分配给int,而不仅仅是十个int(可能大小不同)。
最后请注意,您不需要从malloc()C 中转换返回值。我还没有为您解决这个问题,因为它本身不是问题并且与您的问题无关,但它(可以说)是糟糕的风格。