在我已经有几年的Python,C#和Java经验之后,我才开始学习C.
我在教程中了解到,char anything[]
总是一个指针。 (今天有人告诉我这是错的) - 我认为我的问题与此有关。
不过,我正在尝试获取char数组的长度:
#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()
)
答案 0 :(得分:5)
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,因为{C}标准将sizeof (char)
定义为1。
get_string_length
返回第一个NUL终结符的位置,从传递给它的指针开始。
最后,请注意,您应该使用%zu
作为sizeof
返回类型的格式说明符:从技术上讲,printf("%d\n", sizeof("hello world"));
的行为未定义。
答案 1 :(得分:2)
始终使用 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
答案 2 :(得分: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)。