C 字符大小和长度不一样

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') {

我在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;
}
结果:

八,

十一,

十二,


那么,为什么我的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。。。