试图在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
可以告诉你字符串的长度( 手册页 )。