如果分配了该区域,那么访问超出其结尾的数组是不确定的行为?

Tor*_*erg 5 c undefined-behavior

可能重复:
"struct hack"是技术上未定义的行为吗?

通常访问超出其结尾的数组是C中未定义的行为.例如:

int foo[1];
foo[5] = 1; //Undefined behavior
Run Code Online (Sandbox Code Playgroud)

如果我知道数组末尾之后的内存区域是用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;
}
Run Code Online (Sandbox Code Playgroud)

我已经看到在几个地方使用这个模式来制作一个可变长度的结构,它似乎在实践中起作用.这是技术上未定义的行为吗?

cni*_*tar 6

你所描述的是被亲切地称为" 结构黑客 ".目前尚不清楚它是否完全没问题,但它已被广泛使用.

到目前为止(C99),它已经开始被" 灵活的数组成员 " 取代,int data[];如果它是结构中的最后一个字段,你可以放置一个字段.