我不确定以前是否曾经问过这个问题。我尽力避免两面派。
我在C中使用了sizeof()运算符。
首先我尝试了这个:
char *name;
sizeof(name);
返回大小为4个字节。到目前为止没有问题。
下次我试过这个:
char name[];
sizeof(name); // I even tried name[]
这给了我一个编译错误。
任何人都可以解释为什么会这样?
编辑:我也尝试输入一个到* name的字符串,它远远超过了4个字节的长度。但它能够正确处理它。但是,sizeof(name)仍然返回4个字节。即使编译器已经为* name动态分配了足够的内存,它仍然会报告占用4个字节。这是一个sizeof()错误吗?
答案 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的指针的大小是该类型变量所需的内存空间。
字符数组的大小是数组中的字符数。未初始化的数组未定义。