【发布时间】:2020-02-02 19:09:26
【问题描述】:
有人可以向我解释一下使用和不使用 malloc 创建结构的区别吗?什么时候应该使用malloc,什么时候应该使用正则初始化?
例如:
struct person {
char* name;
};
struct person p = {.name="apple"};
struct person* p_tr = malloc(sizeof(struct person));
p_tr->name = "apple";
两者之间的真正区别是什么?什么时候会使用一种方法而不是其他方法?
【问题讨论】:
-
sizeof(struct person)或sizeof *p_tr有效,但sizeof(person)是语法错误。最佳做法是使用sizeof *p_tr -
我想最大的实际区别是
struct person p = {.name="apple"};创建了一个在封闭块结束时超出范围的变量(例如,如果这是在一个函数中,当函数返回时内存变得无效.) 使用struct person *p,变量p在封闭范围结束时也会失效,但它指向的数据仍然有效。 -
@WilliamPursell 因此,如果我将指针
*ptr存储在某个队列中,即使在函数结束之后尝试检索它,它仍然会存在,但person p不是这种情况? -
当您需要对对象的生命周期进行更多控制时,请使用
malloc,而不是第一个版本提供给您的权限 -
@WilliamPursell:自动对象的生命周期在其关联块的执行结束时结束。这与执行离开范围时不同,因为执行可能通过子例程或中断/信号离开范围。生命周期是 when 在程序执行期间 object 存在。范围是在源文本中 标识符可见的位置。