欢迎各界计算机爱好者加入,弘扬极客精神!

我遇到这样声明结构的代码: struct name { int namelen; char namestr[1];}; 然后又使用一些内存分配技巧使 namestr 数组用起来好像有多个元素。

0 喜欢 0 不喜欢
这样合法和可移植吗?
最新提问 9月 11, 2016 分类:C/C++ | 用户: 0_0 (110 分)  

4 个回答

1 喜欢 0 不喜欢
 
已采纳

这种技术十分普遍, 尽管 Dennis Ritchie 称之为 ``和C 实现的无保证的亲密接触"。 官方的解释认定它没有严格遵守 C 标准, 尽管它看来在所有的实现中都可以工作。 仔细检查数组边界的编译器可能会发出警告。

另一种可能是把变长的元素声明为很大, 而不是很小; 在上例中:

    ...
    char namestr[MAXSIZE];

MAXSIZE 比任何可能存储的 name 值都大。但是, 这种技术似乎 也不完全符合标准的严格解释。这些 ``亲密'' 结构都必须小心使用, 因为只有程序员知道它的大小, 而编译器却一无所知。

C99 引入了 ``灵活数组域'' 概念, 允许结构的最后一个域省略数组大小。 这为类似问题提供了一个圆满的解决方案。

最新回答 9月 11, 2016 用户: 5 (6,842 分)  
采纳于 9月 12, 2016 用户:0_0
0 喜欢 0 不喜欢
0 喜欢 0 不喜欢
很多人看到这个会马上联想到 sizeof(Stu) = sizeof(struct student) = sizeof(Stu.num) + sizeof(Stu.Name) + sizeof(Stu.score) = 4 + 11 + 4 = 19,   但是却发现运行时显示  sizeof(Stu) = sizeof(struct student) = 20。  这是由于编译器的 “字节对齐” 机制引起的,百度一下,会有很多详细讲解的!
最新回答 9月 11, 2016 用户: xkes❤Room (4,102 分)  
0 喜欢 0 不喜欢
是由于编译器的 “字节对齐” 机制引起的,百度一下,会有很多详细讲解的!
最新回答 9月 11, 2016 用户: supinfo_mrthree (2,524 分)  
...