c - 我是否必须释放所有指向同一结构的指针?

标签 c pointers multidimensional-array linked-list free

我有一个使用单链表制作的类数组结构。如果我想删除某个单元格,我是否必须按行和按列释放指向它的指针?

我的结构是这样的:

S  -> C0 -> C1 -> C2 -> ...
       v     v     v
R0 -> 00 -> 01 -> 02 -> ...
       v     v     v
R1 -> 10 -> 11 -> 12 -> ...
       v     v     v 
R2 -> 20 -> 21 -> 22 -> ...

然后说我想删除 11 并重新链接。我必须使用 01 和 10 中的指针释放 11 吗?

S  -> C0 -> C1 -> C2 -> ...
       v     v     v
R0 -> 00 -> 01 -> 02 -> ...
       v     v     v
R1 -> 10 ->->v->->12 -> ...
       v     v     v 
R2 -> 20 -> 21 -> 22 -> ...

最佳答案

不,你不是“释放指针”,而是释放指针指向的内存。

如果您再仔细想想,这应该很容易理解。考虑这样的代码,它是您所问内容的简化 View :

void *ptr = malloc(1024); /* Allocate 1024 KB of memory, somewhere. */
void *copy1 = ptr;
void *copy2 = ptr;
void *copy3 = ptr;
void *copy4 = ptr;

当上面的代码运行时,假设分配成功,我们显然有五个指针指向同一个内存块。我们可以使用五个指针中的任何一个来取消分配内存,因为它们的值相同:

free(ptr3); /* Any one would work. */

当然,我们不能使用多个指针调用 free(),因为所有指针都指向同一 block 内存。

只能释放一个内存块一次,为同一地址多次调用free() 是未定义的行为(除非您在-当然在之间)。

这当然是explained in the manual page你真的应该学习:

The free() function frees the memory space pointed to by ptr, which must have been returned by a previous call to malloc(), calloc() or realloc(). Otherwise, or if free(ptr) has already been called before, undefined behavior occurs. If ptr is NULL, no operation is performed.

关于c - 我是否必须释放所有指向同一结构的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26256567/

相关文章:

c++ - 递归算法和指针的问题

php - 复杂的多维循环到表中

c++ - 声明 char[][512]?

c - 如何修改字符串拆分函数以忽略连续的分隔符?

c++ - 如何为 editline 应用程序的提示着色

c++ - 为三重指针分配内存

我们可以在 C 语言中将整数值转换为指针类型吗?

php - 使用数组的数字键从数据库中存储多维数组

c++ - 使用 StrTk String Toolkit Library 编写 CSV 的示例

你能用visual studio强制替换C中的一些功能吗?