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 回答
你所做的是有效的,但访问s-> string [0]或将s->字符串输入到访问数据的任何函数都是无效的 .
C99标准实际上说(§6.7.2.1):
有一段时间,Microsoft C允许以下内容:
我使用这样的东西来构建文本编辑器 . 然而,这是很久以前的事了,我当时知道它不合标准 . 我甚至不是100%确定微软仍然支持它 .
底线是它取决于您的编译器和当前的编译设置 .