chararray的大小和长度不一样

时间:2017-02-06 13:31:09

标签: c arrays

在我已经有几年的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()

3 个答案:

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