“struct hack”在技术上是未定义的行为吗?我要问的是众所周知的“结构的最后一个成员有可变长度”的技巧。它是这样的:struct T {
int len;
char s[1];};struct T *p = malloc(sizeof(struct T) + 100);p->len = 100;strcpy(p->s, "hello world");由于结构在内存中的布局方式,我们能够将结构覆盖在一个大于必要的块上,并将最后一个成员视为大于1 char指定。所以问题是:这种技术在技术上是未定义的行为吗?..我原以为是这样的,但我很好奇标准是怎么说的。PS:我知道C99的方法,我希望答案特别坚持上面列出的技巧版本。
3 回答

杨__羊羊
TA贡献1943条经验 获得超7个赞
目前还不清楚它是合法的还是便携的,但它相当受欢迎。
..官方解释认为它并不严格符合C标准,尽管它似乎在所有已知的实现中都有效。(仔细检查数组边界的编译器可能会发出警告。)
数组下标超出了范围,即使一个对象显然可以用给定的下标(如lvalue表达式)访问。
a[1][7]
鉴于声明
int a[4][5]
) (6.5.6).
如果指针操作数和结果都指向同一个数组对象的元素,或者指向数组对象的最后一个元素,则计算值不会产生溢出;否则,行为将未定义。
- 3 回答
- 0 关注
- 528 浏览
添加回答
举报
0/150
提交
取消