试图在C中围绕字符串大小包裹我的脑袋

我和一个朋友正在为大学做一个C编程单元。

我们知道C中本身没有“字符串”,相反,字符串是由字符数组定义的。 真棒!

所以当处理“字符串”时,很明显正确理解数组和指针很重要。

我们正在很好地理解指针声明,何时何时不取消引用指针,并使用一些printf来测试我们的实验。 一切都很成功。

但是,当我们使用它时:

 char *myvar = ""; myvar = "dhjfejfdhdkjfhdjkfhdjkfhdjfhdfhdjhdsjfkdhjdfhddskjdkljdklc"; printf("Size is %d\n", sizeof(myvar)); 

它吐出的Size is 8

为什么8? 显然’myvar’消耗了超过8个字节(或者是它)?

(我应该清楚并指出我非常清楚’strlen’。这不是获取字符串长度的练习。这是为了理解为什么sizeof为变量myvar返回8个字节。)

8是指针的大小。 myvar是一个指向char的指针(因此是char *),在64位系统指针中是64位= 8字节

要获取以null结尾的字符串的大小,请使用以下代码:

 #include #include int main() { char *x="hello there"; printf("%d\n",strlen(x)); return 0; } 

就像AbiusX所说的那样,sizeof返回8的原因是因为你找到了指针的大小(我猜你是在64位机器上)。 例如,相同的代码片段将在我的机器上返回4。

C中的字符串保存为字符数组,后跟空终止符。 所以当你这样做的时候……

 const char *message = "hello, world!" 

它实际上存储在内存中:

 'h''e''l''l''o'','' ''w''o''r''l''d''!''\0'...garbage here 

如果你读过null终止符,你可能只是找到当时在内存中发生的垃圾。 因此,为了在C中找到字符串的长度,您需要从字符串的开头开始并读取直到null终止符。

 size_t count = 0; const char *message = "hello, world!"; for ( ; message[count] != '\0'; count++ ); printf("size of message %u\n", count); 

现在这是一个O(n)操作(因为你必须迭代整个数组才能获得大小)。 大多数高级语言的字符串的上层抽象类似于……

 struct string { char *c_str; size_t length; }; 

然后他们只是跟踪字符串在它上面进行操作时的持续时间。 这大大加快了查找字符串的长度,这是一种非常常见的操作。

现在有一种方法可以使用sizeof找出字符串的长度,但我不建议。 在数组(而不是指针!)上使用sizeof将返回数组的大小乘以数据类型大小。 只要可以在编译时计算出来,C就可以自动计算出数组的大小。

 const char message[] = "hello, world!"; printf("size of message %u\n", sizeof(message)); 

这将打印正确的消息大小。 请记住,这不是建议。 请注意,这将打印一个大于字符串中的字符数。 那是因为它还计算了空终止符(因为它必须分配一个足够大的数组以具有空终止符)。 所以它不是真正的字符串长度(你总是可以减去一个)。

myvar是一个指针。 您似乎在64位计算机上,因此sizeof返回8字节大小。 您可能正在寻找的是strlen() 。

就像AbiusX所说的那样,8是指针的大小。 strlen可以告诉你字符串的长度( 手册页 )。