首页 文章

创建大小为零的灵活数组成员是否合法?

提问于
浏览
1

C99标准允许创建灵活的阵列成员,例如

typedef struct pstring {
  size_t length;
  char   string[];
} pstring;

然后用 pstring* s = malloc(sizeof(pstring) + len) 之类的东西初始化它 . 是否允许 len 为零?它似乎是一致的,并且不时会节省空间(当然可能不是用 pstring 示例) . 另一方面,我不知道下面的代码会做什么:

pstring* s = malloc(sizeof(pstring));
s->string;

这看起来似乎可能适用于一个编译器而不是另一个编译器,或者在一个操作系统而不是另一个操作系统上,或者在某一天而不是另一个,所以我真正想知道的是标准对此的说法 . 那是 malloc 在示例代码中是未定义的行为,还是仅仅是对 s->string 的访问无效,还是完全不同的?

2 回答

  • 1

    你所做的是有效的,但访问s-> string [0]或将s->字符串输入到访问数据的任何函数都是无效的 .

    C99标准实际上说(§6.7.2.1):

    struct s {int n; double d []; }; ... struct s t1 = {0}; // valid ...对t1.d [0]的赋值可能是未定义的行为,但sizeof(struct s)> = offsetof(struct s,d)sizeof(double)可能是这样的,在这种情况下,赋值将是合法 . 然而,它不能出现在严格符合规范的代码中 .

  • 5

    有一段时间,Microsoft C允许以下内容:

    struct pstring {
      size_t length;
      char string[0];
    };
    

    我使用这样的东西来构建文本编辑器 . 然而,这是很久以前的事了,我当时知道它不合标准 . 我甚至不是100%确定微软仍然支持它 .

    底线是它取决于您的编译器和当前的编译设置 .

相关问题