chararray的大小和长度不一样[重复]

Posted

技术标签:

【中文标题】chararray的大小和长度不一样[重复]【英文标题】:chararray size and length are not the same [duplicate] 【发布时间】:2017-06-23 11:16:28 【问题描述】:

我在 Python、C# 和 Java 方面拥有几年经验后才开始学习 C。

我在教程中了解到,char anything[] 始终是一个指针。 (今天,有人告诉我这是错误的) - 我认为我的问题与此有关。 不过,我正在尝试获取字符数组的长度:

#include <stdio.h>

int get_string_length(char * string)

    int length = 0;
    while(string[length] != '\0')
       
        char c = string[length];
        length++;
    
    return length;


int get_string_size(char * string)

    return sizeof(string);


int main()

    printf("%d\n", get_string_size("hello world")); // returns 8
    printf("%d\n", get_string_length("hello world")); // returns 11
    printf("%d\n", sizeof("hello world")); // returns 12 -> Okay, because of '\0'-char
    return 0;

结果:

8

11

12

那么,为什么我的get_string_size-方法返回 8 而不是 12? (因为两者都只打电话给sizeof()

【问题讨论】:

get_string_size(char*) 返回 8,因为这是您机器上指针的字节大小,您可以使用 strlen(char*) 来获得我猜您的预期结果。 这么短的时间里有这么多答案 - 而且也是重复的......我想我真的处于C的起点......:D感谢所有答案......我想我需要多读一点 【参考方案1】:

这和你想的不一样:

int get_string_size(char * string)

    return sizeof(string);

这里sizeof(string) 是指针的大小,在您的(大概是64 位)平台上总是8。在 32 位平台上,它很可能是 4 而不是 8。

另一方面,sizeof("hello world") 是字符串文字 "hello world" 占用的内存大小,即 11 + 1(NUL 终止符为 +1)。

【讨论】:

【参考方案2】:

始终使用 strlen() 来确定字符串的长度。

对字符串长度使用 sizeof() 是危险的,应该避免。 sizeof() 返回给定类型的大小,这种情况下给定类型是一个指针(你的系统必须是 64 位,因为大小是 8)。

考虑这段代码及其输出:

char string[] = "This is a test";
char *pointer = string;

printf("sizeof string: %zu\n", sizeof(string));
printf("sizeof pointer: %zu\n", sizeof(pointer));
printf("strlen pointer: %zu\n", strlen(pointer));

sizeof string: 15
sizeof pointer: 8
strlen pointer: 14

【讨论】:

是的,我知道strlen() - 这只是为了学习:) @MatthiasBurger 明白了。仅在确定字符数组(而非指针)的长度时才使用 sizeof()。请参阅我上面的示例。 这实际上打印了 3 次 "zu" 作为值 :D 我的编译器有问题?? @MatthiasBurger 尝试 %u 或 %lu 代替 @MatthiasBurger 好奇你用的是什么编译器?【参考方案3】:

char anything[] 是指针?不完全是。

文字 "hello world" 的实际类型是const char[12]。 (注意 NUL 终止符的额外元素)。

但是当传递给函数时,这种类型衰减const char*

所以get_string_size 在您的平台上返回sizeof(const char*),即8(即char* 的大小),但sizeof("hello world")sizeof(const char[12]),即12,因为sizeof (char) 由C 标准定义为为 1。

get_string_length 正在返回从传递给它的指针开始的第一个 NUL 终止符的位置。

最后,请注意您应该使用%zu 作为sizeof 返回类型的格式说明符:从技术上讲,printf("%d\n", sizeof("hello world")); 的行为是未定义

【讨论】:

printf("%zu\n", sizeof("test")); 实际上用我的代码打印zu...

以上是关于chararray的大小和长度不一样[重复]的主要内容,如果未能解决你的问题,请参考以下文章

c语言中strcmp函数 如果两个字符串长度不一样时要怎么比较大小啊?

宽字符std::wstring的长度和大小问题?sizeof(std::wstring)是固定的32,说明std::wstring是一个普通的C++类,而且和Delphi不一样,没有负方向,因为那个需

如何在java中获取Resultset的长度或大小[重复]

相同比特率和相同长度的 MP3 文件大小不同

李老师 mongoDB中 字符类型的字段 有大小长度限制吗

根据文本长度调整快餐栏消息的大小[重复]