编译错误:C中的sizeof()运算符

时间:2014-05-04 16:03:56

标签: c arrays

我不确定以前是否曾经问过这个问题。我尽力避免两面派。

我在C中使用了sizeof()运算符。

首先我尝试了这个:

char *name;
sizeof(name);

返回大小为4个字节。到目前为止没有问题。

下次我试过这个:

char name[];
sizeof(name); // I even tried name[]

这给了我一个编译错误。

任何人都可以解释为什么会这样?

编辑:我也尝试输入一个到* name的字符串,它远远超过了4个字节的长度。但它能够正确处理它。但是,sizeof(name)仍然返回4个字节。即使编译器已经为* name动态分配了足够的内存,它仍然会报告占用4个字节。这是一个sizeof()错误吗?

3 个答案:

答案 0 :(得分:3)

文件范围内的

char name[];是数组的暂定定义。它有不完整类型。你还不知道它的大小。在定义完成之前,您无法执行sizeof

请注意,这与char *name;无关 - 数组和指针不同。

重新。你的编辑:你把指针与指向的项目混淆了。 char *name;占用4个字节,并指向另一个char。这就是指针的作用:它指向另一个对象。它不一定拥有它指向的内容。字符串的语义是一系列char个对象后跟一个空终止符,name应该指向该系列的第一个项目。

这一切都与sizeof name无关,{{1}}是指针的大小不是指向的项目列表的大小。

答案 1 :(得分:1)

sizeof不能与不完整数组类型的对象一起使用。

char name[];  // name is of an incomplete type

C将不完整类型定义为描述对象但缺乏的类型 确定其大小所需的信息

如果您填写了类型:

char name[];
char name[42];   // type of name is now completed

然后使用sizeof name将有效。

答案 2 :(得分:0)

指向char的指针的大小是该类型变量所需的内存空间。

字符数组的大小是数组中的字符数。未初始化的数组未定义。