2013-05-11 4 views
4

Теперь, из того, что я понимаю, extern в объявлении name[] сообщает компилятору, что его определение находится где-то в другом месте (в моей программе я определил его ниже той части, где я ее использовал). Но почему тогда существует другое Последствия для 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 не заботится о размерах во время компиляции, он просто идет от начала строки до тех пор, пока не найдет символ 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 
3

name определяется после того, как функции main, поэтому компилятор не может сказать вам, что размер name.

sizeof - оператор, который оценивается во время компиляции (за исключением VLA), а символ name будет связан с декларацией впоследствии во время фазы связывания.

Одно из решений состоит в написании размер массива в объявлении:

extern char name[6]; 

Тогда это ваша ответственность, чтобы убедиться, что размер такой же, как в объявлении и определении. Было бы полезно использовать макроконстант.

+0

Просто убедитесь, что вы не «обманываете» компилятор, используя один размер в декларации extern, а другой в определении фактической переменной - это приведет к «интересным» проблемам. –