猿问

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

“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的方法,我希望答案特别坚持上面列出的技巧版本。


蝴蝶不菲
浏览 529回答 3
3回答

杨__羊羊

就像C常见问题说:目前还不清楚它是合法的还是便携的,但它相当受欢迎。以及:..官方解释认为它并不严格符合C标准,尽管它似乎在所有已知的实现中都有效。(仔细检查数组边界的编译器可能会发出警告。)“严格一致”位背后的基本原理是在规范中的一节中。J.2未定义的行为,它包括在未定义的行为列表中:数组下标超出了范围,即使一个对象显然可以用给定的下标(如lvalue表达式)访问。a[1][7]鉴于声明int a[4][5]) (6.5.6).科第8段6.5.6加法算子还提到超出定义数组边界的访问是未定义的:如果指针操作数和结果都指向同一个数组对象的元素,或者指向数组对象的最后一个元素,则计算值不会产生溢出;否则,行为将未定义。
随时随地看视频慕课网APP
我要回答