2013-05-11 33 views
4

现在,据我所知,在name[]的声明中的extern告诉编译器它的定义是在别的地方(在我的程序中,我已经定义它在我已经使用它的部分的下面)。但是为什么然后有不同对于strlen()sizeof的后果? strlen()工作正常,但为sizeof()我得到的错误:为什么“extern char name []”中的数组索引不会影响strlen(name),但会导致sizeof(name)的错误?

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关键字的理解,推理出来的,但我已经打一个瓶颈。所以请给出你的答案。

回答

5

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

例如:

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 
3

name的功能main之后定义,所以编译器不能告诉你什么是name大小。

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

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

extern char name[6]; 

然后,它是你的责任,以确保尺寸在这两个声明和定义是相同的。宏观恒定将是有用的。

+0

只要确保你不会在extern声明中使用一个大小,而在实际的变量定义中使用另一个大小,就会导致“有趣”的问题。 – 2013-05-11 18:41:51

相关问题