所以我是 C 的新手,我创建了一些简单的程序来帮助我掌握一些东西。
假设我有一个结构如下:
typedef struct {
char* field;
} something;
我为其中的 10 个动态分配空间,如下所示:
something* stuff = calloc(10, sizeof(something));
假设我想删除这些内容之一。这样做是否有意义:
free(&stuff[4]);
或者只有当我将所有这些指针都指向某物而不是某物的连续 block 时,这才有意义吗?
如果我这样做并且成功了,将会:
stuff[4] = malloc(sizeof(something))
那么我需要向该索引重新添加“某物”吗?
或者,一般来说,我们是否通常将此类结构处理为包含指向结构的指针的内存块,而不是结构本身?
谢谢。
最佳答案
规则很简单。您可以而且应该准确地释放您分配的资源。也就是说,您必须只传递指向 free()
的指针,您收到它作为 malloc
/calloc
/realloc< 的返回值
等*,或空指针。 没有其他内容可以传递给free()
。
因此,您可以释放整个数组,也可以什么都不释放。
(另请注意,“从中间释放单个元素”将完全没有意义,因为您无法明智地迭代这样一个“神圣”数组。)如果您想释放一些内存,请分配一个 < em>新的范围,复制所需的元素并释放原始数组。
*) 一些准标准函数可能间接返回动态分配的内存,您必须释放这些内存;检查文档。一些示例是 strdup
、GNU 的 scanf
和 GCC 的 abi::__cxa_demangle
。)
关于Calloc()、结构和 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17415330/