C编程 - 数组的大小

时间:2016-03-16 13:12:36

标签: c arrays gcc

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

uintptr_t

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

#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;
}

为什么编译器会这样做?

4 个答案:

答案 0 :(得分:4)

uint8_t reserved[0];这是一个大小为0

的数组

所以sizeof将为零。

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

  

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

答案 3 :(得分:1)

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

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

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