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

标签 c sizeof extern strlen

现在,据我了解,name[] 声明中的 extern 告诉编译器它的定义在其他地方(在我的程序中,我定义了它低于我使用它的部分)。但是为什么 strlen()sizeof 会有不同的结果?strlen() 有效很好,但是对于 sizeof() 我得到了错误:

“sizeof”对不完整类型“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不关心编译-time 大小,它只是从字符串的开头遍历,直到找到标记字符串结尾的 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

关于c - 为什么 "extern char name[]"中缺少数组索引不会影响 strlen(name) 但会导致 sizeof(name) 出错?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16500454/

相关文章:

c - 当在被调用函数中调用 sizeof 运算符时,会发生什么?

c - 动态内存分配中的错误大小

c - malloc.c :2451: sYSMALLOc Assertion failed in C

c - C 中的嵌套结构/链表

c++ - 计算 std::string 的分配内存(以及 std::vector 中字符串的使用)

c++ - C 头文件中的命名空间

C++ "namespace scope"

c++ - 尝试使用 extern "C"在 C 中调用 C++ 方法,得到 "undefined reference to"对象的链接器错误

c - 增加结构段错误的成员

c - 传递指向 typedef 数组的指针