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

Tho*_*hom 4 c sizeof extern strlen

现在,根据我的理解,extern在声明中name[]告诉编译器它的定义是在其他地方(在我的程序中,我已经在我使用它的部分下面定义了它.)但是为什么然后有不同的后果strlen()sizeofstrlen()工作正常,但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
Run Code Online (Sandbox Code Playgroud)

我试图根据我对extern关键字的理解来推断它,但我遇到了瓶颈.所以请给出你的答案.

Mat*_*son 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)); 
Run Code Online (Sandbox Code Playgroud)

这将显示

Bryan Adams: len=5, size=40, strlen(name)=11
Run Code Online (Sandbox Code Playgroud)