首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么C数组不能有0长度?

为什么C数组不能有0长度?
EN

Software Engineering用户
提问于 2014-07-10 21:59:27
回答 4查看 7.8K关注 0票数 14

C11标准说,大小和可变长度的数组“应该有大于零的值”。为什么不允许长度为0?

特别是对于可变长度数组,每隔一次有一个零的大小是非常有意义的。当静态数组的大小来自宏或生成配置选项时,它也非常有用。

有趣的是,GCC (和clang)提供了允许零长度数组的扩展。Java还允许长度为零的数组。

EN

回答 4

Software Engineering用户

回答已采纳

发布于 2014-07-10 22:08:10

我敢打赌的问题是,C数组只是指向分配的内存块开始的指针。有一个0大小就意味着你有一个指向.没什么?你不可能一无所有,所以会有一些武断的选择。您不能使用null,因为这样您的0长度数组看起来就像空指针。在这一点上,每个不同的实现都会选择不同的任意行为,导致混乱。

票数 11
EN

Software Engineering用户

发布于 2014-07-11 01:26:33

如果您想要指向内存地址的指针,请声明一个。一个数组实际上指向您保留的内存块。数组在传递给函数时会衰减为指针,但是如果它们指向的内存位于堆上,则没有问题。没有理由声明大小为零的数组。

票数 1
EN

Software Engineering用户

发布于 2014-07-11 18:30:47

您通常希望您的零(实际上是可变的)大小数组在运行时知道它的大小。然后将其打包到struct中并使用柔性数组成员,例如:

代码语言:javascript
复制
struct my_st {
   unsigned len;
   double flexarray[]; // of size len
};

显然,灵活的数组成员必须是它的struct中的最后一个成员,而且您需要有一些以前的内容。通常,这与灵活数组成员的实际运行时占用长度有关。

当然,您会分配:

代码语言:javascript
复制
 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++中不存在灵活的数组成员(因为很难定义何时以及如何构造和销毁它们)。然而,看看未来的性病:难耐症

票数 1
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/249524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档