Calloc(),Structs&C

Pau*_*l B 2 c struct calloc

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

假设我有一个结构如下:

typedef struct {
   char* field;
} something;
Run Code Online (Sandbox Code Playgroud)

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

something* stuff = calloc(10, sizeof(something));
Run Code Online (Sandbox Code Playgroud)

假设我想删除这些事情中的一个.这样做有意义吗:

free(&stuff[4]);
Run Code Online (Sandbox Code Playgroud)

或者,如果我把所有这些指针都指向某些东西而不是连续的某些块,那么这只会有意义吗?

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

stuff[4] = malloc(sizeof(something))
Run Code Online (Sandbox Code Playgroud)

那么我需要为该索引重新添加"东西"吗?

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

谢谢.

Ker*_* SB 8

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

所以,你可以释放整个阵列,或者根本没有.

(另请注意,"从中间释放单个元素"将完全没有意义,因为您无法合理地迭代这样一个"神圣"阵列.)如果要释放一些内存,请分配一个范围,复制所需的元素结束并释放原始数组.

*)一些准标准函数可以间接返回动态分配的内存,你必须自由; 检查文档.一些例子是strdupGNU scanf和GCC abi::__cxa_demangle.)


Los*_*Boy 5

根据手册页

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

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