释放一个等于 malloc 指针的指针

M-G*_*ire 4 c

我无法理解一些 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的空间?

谢谢

Som*_*ude 5

分别是是和否。

另请注意,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


abl*_*igh 5

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)

那不好。您将 的值存储ptr2ptr1数组中,但没有释放它。你要:

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 中转换返回值。我还没有为您解决这个问题,因为它本身不是问题并且与您的问题无关,但它(可以说)是糟糕的风格。