为什么“extern char name []”中没有数组索引不影响strlen(name)但导致sizeof(name)错误?

时间:2013-05-11 18:33:28

标签: c sizeof extern strlen

现在,根据我的理解,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关键字的理解来推断出来,但我遇到了瓶颈。所以请给出答案。

2 个答案:

答案 0 :(得分:5)

因为sizeofsizeof所在的位置不知道变量的内容,但是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];

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