gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 10:38:50 25 4
gpt4 key购买 nike

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

例如:

struct person {

char* name;

};

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

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

两者之间的真正区别是什么?什么时候会使用一种方法而不是其他方法?

最佳答案

如果我们假设两个例子都出现在一个函数中,那么在:

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

C 实现自动为 p 分配内存并在函数执行结束时释放它(或者,如果语句在嵌套在函数中的块内,则当该块的执行结束时)。这在以下情况下很有用:
  • 您正在处理中等大小的对象。 (对于大对象,使用许多千字节的内存,malloc 可能会更好。阈值因情况而异。)
  • 您一次处理少量对象。

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

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

  • 请注意 struct person p = {.name="apple"};初始化 name成员(member)与 "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_tr的更改需要在两个地方进行编辑,这让人类有机会犯错。对于后者,更改 p_tr 的类型仅在一处仍会导致请求正确的大小。

    关于c - 使用 malloc 和不使用 malloc 创建结构体的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60029592/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com