C11标准说,大小和可变长度的数组“应该有大于零的值”。为什么不允许长度为0?
特别是对于可变长度数组,每隔一次有一个零的大小是非常有意义的。当静态数组的大小来自宏或生成配置选项时,它也非常有用。
有趣的是,GCC (和clang)提供了允许零长度数组的扩展。Java还允许长度为零的数组。
发布于 2014-07-10 22:08:10
我敢打赌的问题是,C数组只是指向分配的内存块开始的指针。有一个0大小就意味着你有一个指向.没什么?你不可能一无所有,所以会有一些武断的选择。您不能使用null,因为这样您的0长度数组看起来就像空指针。在这一点上,每个不同的实现都会选择不同的任意行为,导致混乱。
发布于 2014-07-11 01:26:33
如果您想要指向内存地址的指针,请声明一个。一个数组实际上指向您保留的内存块。数组在传递给函数时会衰减为指针,但是如果它们指向的内存位于堆上,则没有问题。没有理由声明大小为零的数组。
发布于 2014-07-11 18:30:47
您通常希望您的零(实际上是可变的)大小数组在运行时知道它的大小。然后将其打包到struct中并使用柔性数组成员,例如:
struct my_st {
unsigned len;
double flexarray[]; // of size len
};显然,灵活的数组成员必须是它的struct中的最后一个成员,而且您需要有一些以前的内容。通常,这与灵活数组成员的实际运行时占用长度有关。
当然,您会分配:
unsigned len = some_length_computation();
struct my_st*p = malloc(sizeof(struct my_st)+len*sizeof(double));
if (!p) { perror("malloc my_st"); exit(EXIT_FAILURE); };
p->len = len;
for (unsigned ix=0; ix<len; ix++)
p->flexarray[ix] = log(3.0+(double)ix);AFAIK,这在C99中已经成为可能,而且非常有用。
顺便说一句,C++中不存在灵活的数组成员(因为很难定义何时以及如何构造和销毁它们)。然而,看看未来的性病:难耐症
https://softwareengineering.stackexchange.com/questions/249524
复制相似问题