Calloc(),Structs& C

时间:2013-07-01 23:40:41

标签: c struct calloc

所以我是C的新手并创建了一些简单的程序来帮助我解决问题。

假设我有一个结构如下:

typedef struct {
   char* field;
} something;

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

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

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

free(&stuff[4]);

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

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

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

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

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

感谢。

2 个答案:

答案 0 :(得分:8)

规则很简单。您可以而且应该准确地释放您分配的内容。也就是说,您只能将指向free()的指针作为malloc / calloc / realloc等*的返回值或空指针传递给指针。 其他可以传递给free()

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

(另请注意,“从中间释放单个元素”将完全没有意义,因为你无法合理地迭代这样一个“神圣”阵列。)如果你想释放一些内存,请分配一个< em> new 范围,复制所需的元素并释放原始数组。

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

答案 1 :(得分:5)

根据手册页

  

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

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