可能是重复问题:
“结构体黑客”技术上是否未定义行为?
通常在C语言中,访问数组超出其结束位置是未定义的行为。例如:
int foo[1];
foo[5] = 1; //Undefined behavior
如果我知道数组结束后的内存区域已经被分配(通过malloc或者在堆栈上),这仍然算是未定义行为吗?以下是一个例子:
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
int len;
int data[1];
} MyStruct;
int main(void)
{
MyStruct *foo = malloc(sizeof(MyStruct) + sizeof(int) * 10);
foo->data[5] = 1;
}
我已经在几个地方看到过这种模式用来创建变长的结构体,而且实际上似乎也可以工作。这是否属于技术上未定义的行为?