我有一个零单元格数组,我想调整他的大小。 我的代码是:
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;
}
为什么编译器会这样做?
答案 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支持它作为扩展的原因。