现在,根据我的理解,extern
声明中的name[]
告诉编译器它的定义是在其他地方(在我的程序中,我已经在我使用过的部分下面定义了它)但是为什么strlen()
和sizeof
有不同的后果?strlen()
工作得很好,但对于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
关键字的理解来推断出来,但我遇到了瓶颈。所以请给出答案。
答案 0 :(得分: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
答案 1 :(得分:3)
name
在函数main
之后定义,因此编译器无法告诉您name
的大小是多少。
sizeof
是在编译时进行评估的运算符(除了使用VLA),在链接阶段,符号name
将与声明关联。
一种解决方案是在声明中写出数组的大小:
extern char name[6];
然后,您有责任确保声明和定义中的大小相同。宏观主义者会很有用。