【问题标题】:Why it makes error with the assignment of `struct`? [duplicate]为什么分配`struct`会出错? [复制]
【发布时间】:2017-10-15 12:00:48
【问题描述】:

我用 C 语言创建了一个简单的struct,用于存储我的数据:

typedef struct
{
    int n;
    char *c[];
} simstr;

并且,对于这个结构变量的赋值,我使用了这个代码:

simstr ex =
{
    5,

    "ex_11",
    "ex_12",
    "ex_13",
    "ex_14",
    "ex_15"
};

为了测试是否正确创建了ex 变量,我运行了我制作的这个函数:

void funct(simstr a)
{
    int i,
        n = a.n;

    for (i = 0; i < n; i++)
    {
        printf("%s\n", a.c[i]);
    }
}

funct(ex);

我编译成功了。不幸的是,它返回 2 行 Θ&amp;;然后,该程序因运行时错误而停止。


你能告诉我:为什么分配struct会出错?以及如何解决?

【问题讨论】:

  • 你能给我解释一下:有一个奉献者吗?
  • 另外,灵活数组成员的初始化不符合标准;并且聚合初始化器需要 {} 括号括起来。你正在使用一些 GCC 扩展或类似的东西。

标签: c arrays struct char


【解决方案1】:

您不能像其他结构一样复制带有flexible array member 的结构。

最简单的解决方案是完全不涉及任何复制,通过使用指向结构的指针作为函数参数。那么结构就不会被(不完全)复制。

使用地址运算符&amp;从结构中创建一个指针。

【讨论】:

  • 以及函数内部的-&gt; 运算符。
  • 我使用 C 的 ANSI 标准。对我有什么建议吗?
  • @dn174822 是的。使用指针。灵活的数组成员(如果您关注并阅读了我的链接,您应该知道)是 C99 标准的一部分,所以它一直在“ANSI C”中(如果“ANSI C”是指 standard C)快20年了。并且指针一直是 C 编程的自然组成部分,包括地址运算符。
  • @dn174822: AFAIK,在 ANSI C 中没有灵活的数组成员,所以你的代码一开始就不是严格的 ANSI C 兼容的。
  • "你不能用灵活的数组成员复制结构" - 此外,你不能为它们分配空间,除非使用 malloc 或类似的(ex 的初始化在OP 被标准禁止)。
猜你喜欢
  • 2020-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多