4

现在,据我了解,extern声明中的name[]告诉编译器它的定义在其他地方(在我的程序中,我已经在我使用它的部分下面定义了它)。但是为什么 and 会有不同的strlen()结果sizeofstrlen()工作正常,但sizeof()我得到错误:

invalid application of 'sizeof' to incomplete type 'char[]' |

这是我的程序:

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

extern char name[];

int main()
{
printf("%d,%d",strlen(name),sizeof(name));
}

char name[]="Bryan";
//char name[6]="Bryan"; //Neither of these make sizeof work

我试图根据我对extern关键字的理解来推理它,但我遇到了瓶颈。所以请给出你的答案。

4

2 回答 2

5

因为sizeof不知道变量所在点的内容sizeof,但strlen不关心编译时大小,它只是从字符串的开头遍历,直到找到一个标记字符串结尾的 NUL 字符。

例如:

 char name[40] = "Bryan";

 ... 

    size_t size = sizeof(name);
    size_t len = strlen(name)

    strcat(name, " Adams"); 

    printf("%s: len=%zd, size=%zd, strlen(name)=%zd\n", 
           name, len, size, strlen(name)); 

这将显示

Bryan Adams: len=5, size=40, strlen(name)=11
于 2013-05-11T18:40:28.043 回答
3

name是在函数之后定义的main,所以编译器无法告诉你name.

sizeof是在编译时评估的运算符(VLA 除外),并且该符号name将在之后的链接阶段与声明相关联。

一种解决方案是在声明中写入数组的大小:

extern char name[6];

然后,您有责任确保声明和定义中的大小相同。宏常量会很有用。

于 2013-05-11T18:40:31.273 回答