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

时间:2011-03-15 01:04:27

标签: c pointers sizeof

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

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

因此,在处理“字符串”时,很明显正确理解数组和指针很重要。

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

然而,当我们使用它时:

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

并吐出Size is 8

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

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

4 个答案:

答案 0 :(得分:8)

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

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

#include<string.h>
#include<stdio.h>

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

答案 1 :(得分:2)

正如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中找到字符串的长度,您需要从字符串的开头开始并读取直到空终止符。

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));

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

像AbiusX所说的那样,8是指针的大小。 strlen可以告诉您字符串的长度(man page)。