chararray的大小和长度不一样
我已经有了几年的Python,C#和Java经验,我刚开始学习C语言。
我在教程中学到了char anything[]
总是一个指针。 (今天有人告诉我这是错的) – 我认为我的问题与此有关。 不过,我正在尝试获取char数组的长度:
#include 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
-method返回8而不是12? (因为两者都只调用sizeof()
)
char anything[]
是指针? 不完全的。
文字 "hello world"
的实际类型是const char[12]
。 (注意NUL终结符的额外元素)。
但是当传递给函数时,这种类型会衰减为const char*
。
所以get_string_size
返回sizeof(const char*)
,它在你的平台上是8(即char*
的大小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("%d\n", sizeof("hello world"));
未定义 。
始终使用strlen()来确定字符串的长度。
对字符串长度使用sizeof()是危险的,应该避免。 sizeof()返回给定类型的大小,这种情况下给定的类型是指针(由于大小为8,系统必须是64位)。
考虑这段代码及其输出:
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
这不符合你的想法:
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)。