2013-05-11 3 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 키워드에 대한 이해를 기반으로 그것을 밖으로 추론하기 위하여 노력을하지만, 나는 명중했다 병목 현상 이군. 그래서 대답 해주세요. sizeof이 내용을 sizeof는 점에서 변수를 알 수 없지만, strlen는 컴파일시 크기에 대한 상관하지 않기 때문에이 마킹 NUL 문자를 찾을 때까지

답변

5

는 단순히 문자열의 시작 부분에서 산책 문자열의 끝. 예를 들어

:

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 선언에서 하나의 크기를 사용하고 실제 변수 정의에서 다른 하나의 크기를 사용하여 컴파일러를 "속이거나" "재미있는"문제가 발생하는지 확인하십시오. –