现在,据我了解,name[]
声明中的 extern
告诉编译器它的定义在其他地方(在我的程序中,我定义了它低于我使用它的部分)。但是为什么 strlen()
和 sizeof
会有不同的结果?strlen()
有效很好,但是对于 sizeof()
我得到了错误:
“sizeof”对不完整类型“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
关键字的理解进行推理,但我遇到了瓶颈。所以请给出你的答案。
最佳答案
因为sizeof
不知道sizeof
所在的变量的内容,但是strlen
不关心编译-time 大小,它只是从字符串的开头遍历,直到找到标记字符串结尾的 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
关于c - 为什么 "extern char name[]"中缺少数组索引不会影响 strlen(name) 但会导致 sizeof(name) 出错?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16500454/