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不一样,没有负方向,因为那个需