使用malloc和不使用malloc创建结构的区别

阿曼达

有人可以向我解释创建带有和不带有malloc的结构之间的区别。什么时候应该使用malloc以及什么时候应该使用常规初始化?

例如:

struct person {

    char* name;

};

struct person p = {.name="apple"};

struct person* p_tr = malloc(sizeof(struct person));
p_tr->name = "apple";

两者之间的真正区别是什么?什么时候将一种方法用于其他方法?

埃里克·波斯蒂奇(Eric Postpischil)

如果我们假设两个示例都在函数内部,则在:

struct person p = {.name="apple"};

C实现会自动p为该函数分配内存,并在函数执行结束时(或者,如果该语句位于函数中嵌套的块内,则在该块执行结束时)释放内存在以下情况下很有用:

  • 您正在使用中等大小的对象。(对于大对象,使用许多kb的内存malloc可能更好。阈值视情况而定。)
  • 您一次只能处理少量对象。

在:

struct person* p_tr = malloc(sizeof(struct person));
p_tr->name = "apple";

程序显式请求对象的内存,并且程序通常应free在完成对象时释放该内存在以下情况下很有用:

  • 该对象必须返回给函数的调用者。当函数执行结束时,上面使用的自动对象将不复存在(在C计算模型中;计算机中的实际内存不会停止存在-而是不再保留供该对象使用) ,但是这个分配的对象将继续存在,直到程序释放它(或结束执行)。
  • 该对象非常大。(通常,C实现malloc比自动对象为分配提供更多的内存。)
  • 该程序将根据情况创建可变数量的此类对象,例如根据读取前未知大小的输入创建链接列表,树或其他结构。

请注意,使用struct person p = {.name="apple"};初始化name成员,"apple"并将所有其他成员初始化为零。但是,使用malloc并分配给p_tr->name的代码不会初始化其他成员。

如果struct person p = {.name="apple"};出现在函数外部,则它将创建一个具有静态存储持续时间的对象。它会在程序执行期间存在。

相反struct person* p_tr = malloc(sizeof(struct person));,最好使用struct person *p_tr = malloc(sizeof *p_tr);对于前者,对p_trrequire的更改需要在两个地方进行编辑,这使人有机会犯错。对于后者,p_tr仅在一个位置更改类型仍然会导致请求正确的大小。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章