首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Calloc()、Structs &C

Calloc()、Structs &C
EN

Stack Overflow用户
提问于 2013-07-01 23:40:41
回答 2查看 2.2K关注 0票数 2

所以我对C很陌生,并创建了一些简单的程序来帮助我掌握一些窍门。

假设我有如下结构:

代码语言:javascript
复制
typedef struct {
   char* field;
} something;

我动态地分配了10个空间,如下所示:

代码语言:javascript
复制
something* stuff = calloc(10, sizeof(something));

假设我想删除其中的一个东西。这样做有意义吗:

代码语言:javascript
复制
free(&stuff[4]);

或者,只有当我把所有这些指点都指向某些事物,而不是一连串的某些事物时,这才有意义吗?

如果我这么做了,成功了,会:

代码语言:javascript
复制
stuff[4] = malloc(sizeof(something))

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

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

谢谢。

EN

回答 2

Stack Overflow用户

发布于 2013-07-01 23:43:42

规则很简单。你可以而且应该完全释放你分配的东西。也就是说,您必须只将指针传递到作为malloc/calloc/realloc等的返回值接收到的free(),或者是一个空指针。其他任何东西都不能传递给free()

因此,您可以释放整个数组,或者什么也不释放。

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

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

票数 8
EN

Stack Overflow用户

发布于 2013-07-01 23:44:31

根据手册页

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

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17415330

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档