当前位置: 首页 > 知识库问答 >
问题:

为什么允许在结构中使用未定义的大小数组?

史旺
2023-03-14

当我编写以下代码时,我得到了预期的错误错误:“data”中缺少数组大小

int main()
{
    unsigned char data[];

    return 0;
}

然而,当我运行相同的代码,但将违规行包装在结构中时,不会有错误。

typedef struct credit_card_s
{
  unsigned char is_valid;

  unsigned char data[];

} credit_card_t;

有人能解释一下为什么允许这样做吗?


共有2个答案

夔波
2023-03-14

这在C中是不合法的。在结构之外,声明数组时需要一个大小,因为以后无法设置大小:

int main()
{
  unsigned char data[100];

  return 0;
}

这是C语言中的合法操作,允许您在为结构分配内存时为数组分配内存。灵活数组成员必须是结构中的最后一个元素。

以下是一个基于GCC文档的示例:

struct line
{
  int length;
  char contents[]; // Flexible array member
};

struct line *myline = malloc(sizeof(struct line) + 100); // 100 bytes for the array
myline->length = 100;

楚宏胜
2023-03-14

后者称为“柔性阵列成员”,这是结构的特例。结构的最后一个成员不允许有大小。

作为一种特殊情况,具有多个命名成员的结构的最后一个元素可能具有不完整的数组类型;这称为灵活数组成员。在大多数情况下,将忽略灵活数组成员。特别是,结构的大小就像省略了柔性数组成员一样,只是它可能具有比省略所暗示的更多的尾部填充。然而,当一个。(或-

另请参见示例20。

前者是普通数组,不允许大小为零。请参见6.7.6.2阵列声明器。

如果它们分隔表达式(指定数组的大小),则表达式应具有整数类型。如果表达式是常量表达式,则其值应大于零。换句话说,语言标准是这么说的。

 类似资料:
  • 问题内容: Java中的数组的长度是固定的。Java为什么要允许大小为0的数组呢? 问题答案: 它表示它为空。即您可以遍历它,就好像它有项目并且没有结果发生一样: 从而避免了检查的需要。如果所讨论的数组为,则会发生异常,但是在这种情况下,它什么也不做,这可能是适当的。

  • 如果我有一个封装两个成员的结构,并基于另一个成员更新其中一个,那么只要我这样做就可以了: 也就是说,当我直接提到self时。b 。但当我将do\u stuff()更改为以下内容时: 编译器抱怨:<代码>无法将`*self`借用为不可变,因为` self `。a `也被借用为可变的。 如果我需要执行比返回成员更复杂的操作来获取a.do\u something()的参数,该怎么办?我必须创建一个按值返

  • 问题内容: 来自C语言的Go语言最值得注意的方面之一是,如果在其中声明了一个未使用的变量,编译器将不会编译您的程序。那么,如果在函数中声明了一个未使用的参数,那么为什么要构建此程序呢? 问题答案: 没有正式的原因,但是在golang-nuts上给出的原因是: 未使用的变量始终是编程错误,而编写不使用其所有参数的函数是很常见的。 可以将这些参数保留为未命名(使用_),但这可能会与诸如 func fo

  • 问题内容: 在Java虚拟机规范说有布尔有限的支持原始类型。 没有Java虚拟机指令专门用于布尔值的操作。相反,将对布尔值进行操作的Java编程语言中的表达式编译为使用Java虚拟机int数据类型的值。 以上暗示(尽管我可能会误解了)在对布尔值进行操作时使用了int数据类型,但这是一个32位内存构造。假设布尔值仅表示1位信息: 为什么不将字节(或简称)类型用作布尔值而不是int的代理? 对于任何给

  • 问题内容: 我可以一次发送到的最大数据大小HttpURLConnection是Tomcat多少?请求大小是否有限制? 问题答案: maxPostSize 容器FORM URL参数解析将处理的POST的最大大小(以字节为单位)。可以通过将此属性设置为小于或等于0的值来禁用该限制。如果未指定,则将该属性设置为2097152(2兆字节)。 另一个限制是: maxHttpHeaderSize请求和响应HT

  • .我的理解是,这是因为javac像解释器一样工作,逐行读取。但是当涉及到我们调用类中的字段并向其传递值的方法时,我们可以在方法声明之后定义字段。 参数eyes、tail、Teath和coat在用于将值传递给构造函数后定义。javac如何理解方法后有一个变量。允许这样做是因为我们只能定义字段,而不能在类定义中对它们进行任何操作吗?