2

所以我是 C 的新手,我创建了一些简单的程序来帮助我掌握一些东西。

假设我有一个结构如下:

typedef struct {
   char* field;
} something;

我为其中的 10 个动态分配空间,如下所示:

something* stuff = calloc(10, sizeof(something));

假设我想删除这些东西之一。这样做是否有意义:

free(&stuff[4]);

或者,只有当我将所有这些指针都指向某物而不是连续的某物块时,这才有意义?

如果我这样做并且它有效,将:

stuff[4] = malloc(sizeof(something))

那么我只需要在该索引中重新添加一个“东西”吗?

或者,一般来说,我们是否通常处理这样的结构,例如包含指向结构的指针的内存块,而不是结构本身?

谢谢。

4

2 回答 2

8

规则很简单。您可以并且应该准确地释放您分配的内容。也就是说,您必须只传递free()您收到的指针作为//etc.* 的返回值,malloc或者一个空指针。没有其他东西可以传递给.callocreallocfree()

所以,你可以释放整个数组,或者什么都不释放。

(另请注意,“从中间释放单个元素”完全没有意义,因为您无法明智地迭代这样一个“神圣”数组。)如果您想释放一些内存,分配一个范围,复制所需的元素覆盖并释放原始数组。

*) 一些准标准函数可能会间接返回动态分配的内存,您必须使用它;检查文档。一些例子是strdup, GNU'sscanf和 GCC's abi::__cxa_demangle。)

于 2013-07-01T23:43:42.130 回答
5

根据手册页

free() 函数释放 ptr 指向的内存空间,该内存空间必须由先前对 malloc()、calloc() 或 realloc() 的调用返回。否则,或者如果之前已经调用过 free(ptr),则会发生未定义的行为。

您只能释放整个数据块。所以不要试图释放其他任何东西。

于 2013-07-01T23:44:31.633 回答