use*_*420 1 c free pointers linked-list multidimensional-array
我有一个使用单链表制作的类似数组的结构.如果我想删除某个单元格,我是否必须释放指向行和列的指针?
我的结构看起来像这样:
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 -> ...
Run Code Online (Sandbox Code Playgroud)
并说我想删除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 -> ...
Run Code Online (Sandbox Code Playgroud)
不,你没有"释放指针",你释放了指针指向的内存.
如果您再考虑一下,这应该很容易理解.考虑这样的代码,这是对您要求的简化视图:
void *ptr = malloc(1024); /* Allocate 1024 KB of memory, somewhere. */
void *copy1 = ptr;
void *copy2 = ptr;
void *copy3 = ptr;
void *copy4 = ptr;
Run Code Online (Sandbox Code Playgroud)
当上面已经运行时,假设分配成功,我们显然有五个指向同一块内存的指针.我们可以使用五个指针中的任何一个来取消分配内存,因为它们的值是相同的:
free(ptr3); /* Any one would work. */
Run Code Online (Sandbox Code Playgroud)
当然,我们不能free()使用多个指针调用,因为所有指针都指向同一块内存.
你只能释放一块内存,free()对于同一个地址多次调用是不确定的行为(除非你在中间进行了新的分配).
这当然在您真正应该学习的手册页中进行了解释:
该
free()函数释放ptr指向的内存空间,该内存空间必须由之前的调用返回malloc(),calloc()或realloc().否则,或者如果free(ptr)之前已经调用过,则会发生未定义的行为.如果ptr是NULL,则不执行任何操作.