【问题标题】:Any way to initialize a dynamically allocated structure? [duplicate]有什么方法可以初始化动态分配的结构? [复制]
【发布时间】:2017-10-01 11:02:24
【问题描述】:

C11 为我们提供了简洁的结构初始化语法:

struct some_struct {int some; char value;};
struct some_struct s = {.some = 5, .value = 'a'};
printf("some = %d, value = %c\n", s.some, s.value);

http://ideone.com/zZxTc4

但是,当必须动态分配结构时,它似乎不起作用:

struct some_struct {int some; char value;};
struct some_struct *s = malloc(sizeof(struct some_struct));
*s = {.some = 5, .value = 'a'};
printf("some = %d, value = %c\n", s->some, s->value);

这段代码产生:

error: expected expression before ‘{’ token
  *s = {.some = 5, .value = 'a'};
       ^

http://ideone.com/nBiorw

struct some_struct {int some; char value;};
struct some_struct *s = malloc(sizeof(struct some_struct));
*s = struct some_struct {.some = 5, .value = 'a'};
printf("some = %d, value = %c\n", s->some, s->value);

这段代码产生:

error: expected expression before ‘struct’
  *s = struct some_struct {.some = 5, .value = 'a'};
       ^~~~~~

http://ideone.com/SpBX1E

在 C 中有什么方法可以很好地初始化一个动态分配的结构,或者我宁愿写这样的东西:

struct some_struct {int some; char value;};
struct some_struct *s = malloc(sizeof(struct some_struct));
s->some = 5;
s->value = 'a';
printf("some = %d, value = %c\n", s->some, s->value);

http://ideone.com/1XAiQS

这稍微有点不方便,因为 (a) 这意味着结构的每个成员都必须占据自己的行,因为当人们在源代码中看到 ; 符号不是其行的最后一个符号时往往会皱眉, 和 (b) 我不能像在正常的结构初始化中那样依赖未指定的值被初始化为 0

【问题讨论】:

    标签: c struct initialization compound-literals


    【解决方案1】:

    在您的代码中

     *s = {.some = 5, .value = 'a'};
    

    不是initialization,而是assignment

    Brace enclosed initializer 只能在初始化期间使用。

    不过,您可以使用 compound literal。类似的东西

    *s = (struct some_struct){.some = 5, .value = 'a'};
    

    会做的。

    【讨论】:

    • 限定“初始化程序”structconst,否则您最终可能会得到两个副本,具体取决于编译器的优化程度。尽管它的名字,一个复合文字不是一个常数。
    • 只是补充一点,这仍然不是初始化而是赋值。
    • @AjayBrahmakshatriya 对,我们正在努力让任务在那里工作。 :)
    • 我有点困惑(部分是因为 cmets)。假设我在一个函数中执行此操作,然后从该函数返回 s。我会遇到段错误吗,因为分配的结构将在函数结束时被销毁?
    • @domsson 不是真的,只要为s 分配的内存仍然有效,s 的成员的值也将有效。复合文字的值存储在 s 的成员中。
    猜你喜欢
    • 2015-07-23
    • 2021-04-12
    • 2017-08-27
    • 1970-01-01
    • 1970-01-01
    • 2016-12-11
    • 1970-01-01
    • 1970-01-01
    • 2016-05-11
    相关资源
    最近更新 更多