有如下结构体定义
typedef struct { int oper; int nops; struct nodeTypeTag *op[1]; // nodeTypeTag定义省略 }oprNodeType;
这里声明了一个nodeTypeTag* 数组,看上去似乎只有一个元素的位置
但是在使用到这个结构体的代码中有
oprNodeType *p; /* 中略 */ p->op[1] = ... p->op[2] = ...
这里怎么又能操作p->op[1]和p->op[2]呢?
或者之前定义的时候那个元素个数其实是无关的?
这是一种常见的使用动态数组的技巧。C语言编译器并不会检查[]中间的是否会越界,只要运行的时候分配足够大的空间就可以了。
typedef struct {
int size;
int n[1];
}ARR;int main(void)
{
ARR *p = (ARR*)malloc(sizeof(ARR) + sizeof(int)*100);
ARR a;
//a.n[100] = 10; //wrong
p->n[100] = 10; //correct
printf("%d",p->n[100]);
return 0;
}
感谢