【问题标题】:chararray size and length are not the same [duplicate]chararray的大小和长度不一样[重复]
【发布时间】:2017-06-23 11:16:28
【问题描述】:

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

结果:

8

11

12

那么,为什么我的get_string_size-方法返回 8 而不是 12? (因为两者都只打电话给sizeof()

【问题讨论】:

  • get_string_size(char*) 返回 8,因为这是您机器上指针的字节大小,您可以使用 strlen(char*) 来获得我猜您的预期结果。
  • 这么短的时间里有这么多答案 - 而且也是重复的......我想我真的处于C的起点......:D感谢所有答案......我想我需要多读一点

标签: c arrays


【解决方案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)。

【讨论】:

    【解决方案2】:

    始终使用 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
    

    【讨论】:

    • 是的,我知道strlen() - 这只是为了学习:)
    • @MatthiasBurger 明白了。仅在确定字符数组(而非指针)的长度时才使用 sizeof()。请参阅我上面的示例。
    • 这实际上打印了 3 次 "zu" 作为值 :D 我的编译器有问题??
    • @MatthiasBurger 尝试 %u 或 %lu 代替
    • @MatthiasBurger 好奇你用的是什么编译器?
    【解决方案3】:

    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,因为sizeof (char) 由C 标准定义为为 1。

    get_string_length 正在返回从传递给它的指针开始的第一个 NUL 终止符的位置。

    最后,请注意您应该使用%zu 作为sizeof 返回类型的格式说明符:从技术上讲,printf("%d\n", sizeof("hello world")); 的行为是未定义

    【讨论】:

    • printf("%zu\n", sizeof("test")); 实际上用我的代码打印zu...
    猜你喜欢
    • 2019-05-31
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-02
    • 1970-01-01
    • 2021-07-02
    相关资源
    最近更新 更多