C 字符大小和长度不一样
我在Python、C和Java方面已经有了几年的经验之后,才开始学习C 我在一个教程中了解到,char anything[]始终是一个指针。今天,有人告诉我这是错误的——我想我的问题与此有关。 尽管如此,我仍在尝试获取字符数组的长度:C 字符大小和长度不一样,c,arrays,C,Arrays,我在Python、C和Java方面已经有了几年的经验之后,才开始学习C 我在一个教程中了解到,char anything[]始终是一个指针。今天,有人告诉我这是错误的——我想我的问题与此有关。 尽管如此,我仍在尝试获取字符数组的长度: #include <stdio.h> int get_string_length(char * string) { int length = 0; while(string[length] != '\0') {
#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;
}
结果:
八,
十一,
十二,
那么,为什么我的get\u string\u size方法返回的是8而不是12?由于两者都只调用sizeof,这与您的想法不符:
int get_string_size(char * string)
{
return sizeof(string);
}
这里sizeofstring是指针的大小,在您的64位平台上总是8。在32位平台上,它很可能是4而不是8
另一方面,sizeofhello world是字符串文字hello world占用的内存大小,对于NUL终止符为11+1+1。始终使用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
char anything[]是指针吗?不完全是
文字hello world的实际类型是const char[12]。请注意NUL终止符的额外元素
但当传递给函数时,该类型将衰减为常量char*
因此get_string_size返回sizeofconst char*,在您的平台上是8,即char*的大小,但是sizeofhello world是sizeofconst char[12],它是12,因为C标准将sizeof char定义为1
get_string_length返回从传递给它的指针开始的第一个NUL终止符的位置
最后,请注意,您应该使用%zu作为sizeof返回类型的格式说明符:从技术上讲,printf%d\n的行为,sizeofhello world;未定义。get\u string\u sizechar*返回8,因为这是您计算机上指针的字节大小,您可以使用strlenchar*获得我猜是您期望的结果。在这么短的时间内有这么多答案,而且是重复的。。。我想我真的在C的起点上…:D谢谢你的回答。。。我想我需要多读一点。是的,我知道斯特伦——这只是为了学习:@MatthiasBurger明白了。仅在确定字符数组而不是指针的长度时使用sizeof。请参阅上面的示例。这实际上打印了3倍于zu的值:D我的编译器有问题???@MatthiasBurger请尝试%u或%luinstead@MatthiasBurger好奇您正在使用什么编译器?printf%zu\n,sizeoftest;实际上是用我的代码打印zu。。。