【问题标题】:C programming - Sizeof an array [duplicate]C编程-数组的大小[重复]
【发布时间】:2016-03-16 13:12:35
【问题描述】:

我有一个零单元格数组,我想显示他的大小。 我的代码是:

#include <stdio.h>
#include <string.h>
#include <stdint.h>

typedef struct ts_ff {

    uint8_t reserved[0];
} TS_fact;

int main(void) {
    TS_fact ts_factory;
    printf("size of reserved is %zu Bytes\n",sizeof(ts_factory));

   return 0;
}

但是此代码的返回返回 0 字节而不是该数组单元格的 1 字节。

size of reserved is 0 Bytes

为什么编译器会这样做?

【问题讨论】:

  • 一个单元格?我看到零单元格。
  • 一个单元格的数组 => 在哪里?
  • 好的。所以,为什么我可以使用 ts_factory.reserved[0]=12;例如。我可以使用这个细胞。编译器影响值没有错误。
  • uint8_t reserved[0]中,0不是最后一个元素的索引,而是数组的大小。如果您分配reserved[0] = 12,您指的是索引为0 的元素。在声明中,给出的数字是数组的大小,而不是索引。例如,声明 uint8_t a[10] 将有 10 个元素,但 a[10] 将是无效索引,因为该数组的索引从 0 到 9(10 个元素)。
  • 零大小数组是一个过时和弃用的 gcc 扩展。 C 标准在 ISO9899:1999 (C99) 中引入了灵活的数组成员。使用它们!

标签: c arrays gcc


【解决方案1】:

uint8_t reserved[0];它是一个大小为0的数组

所以 sizeof 将为零。

【讨论】:

    【解决方案2】:

    编译器是正确的,因为数组的大小是0,您需要根据需要在代码中更改数组的大小。
    uint8_t reserved[N];
    N 的大小为您需要的数组。

    编译器如何接受这一点: 一切都有一个唯一的身份,即一个唯一的地址,这意味着一个非零的长度。它是合法的 分配一个大小为零的数组。你根本无法做任何有用的事情 因为没有有效的数据供您访问。但是reserved[0] = 10; 是非法的。

    【讨论】:

    • 是的。我知道这个 。但我想明白,为什么编译器接受数组索引的值的关联,否则不会为其分配,我可以看到正确关联的值。
    • @MarwenBkh 更新了我的答案,希望对您有所帮助
    • 我你说reserved[0] =10 是非法的。您应该先尝试一下,因为编译器会接受它并正确显示其关联值。
    • @MarwenBkh 我的编译器不接受它。你可以codepad.org/yuRUsoEA检查这个
    • 感谢您的帮助。我应该在不同机器上的不同 gcc 版本上尝试我的代码。
    【解决方案3】:

    编译器是正确的:你有一个大小为 zero (uint8_t reserved[0]) 的数组作为你的结构的唯一成员,所以sizeof 给你零。为什么要为大小为零的对象分配内存?

    【讨论】:

      【解决方案4】:

      这是一个 gcc 扩展,自 1999 年以来在标准 C 中无效。

      https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html

      这是 1989 年标准 C 和早期(标准前)C 中存在的一种 hack。这可能是 gcc 支持它作为扩展的原因。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-05-12
        • 1970-01-01
        • 1970-01-01
        • 2021-08-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多