为了账号安全,请及时绑定邮箱和手机立即绑定

“struct hack”在技术上是未定义的行为吗?

“struct hack”在技术上是未定义的行为吗?

C
蝴蝶不菲 2019-07-09 13:13:58
“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常见问题说:

目前还不清楚它是合法的还是便携的,但它相当受欢迎。

以及:

..官方解释认为它并不严格符合C标准,尽管它似乎在所有已知的实现中都有效。(仔细检查数组边界的编译器可能会发出警告。)

“严格一致”位背后的基本原理是在规范中的一节中。J.2未定义的行为,它包括在未定义的行为列表中:

  • 数组下标超出了范围,即使一个对象显然可以用给定的下标(如lvalue表达式)访问。

    a[1][7]

    鉴于声明

    int a[4][5]) (6.5.6).

科第8段6.5.6加法算子还提到超出定义数组边界的访问是未定义的:

如果指针操作数和结果都指向同一个数组对象的元素,或者指向数组对象的最后一个元素,则计算值不会产生溢出;否则,行为将未定义。


查看完整回答
反对 回复 2019-07-09
  • 3 回答
  • 0 关注
  • 528 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号