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