【问题标题】:What's the size of char string array element?char 字符串数组元素的大小是多少?
【发布时间】:2012-11-30 12:36:28
【问题描述】:

我现在正在学习 c,我对 char 字符串数组元素的 size 元素有点困惑。

举个例子:

char *states[] = {
    "California", "Oregon",
    NULL, "Texas"
};

我想看看如何获​​得数组的大小,所以我可以在 for 循环中计算它。我从某个站点找到了这个计算来获取数组的大小:

int size = sizeof(states) / sizeof(states[0]);

我有点疑惑,为什么sizeof(states[0]) 是8 个字节?

【问题讨论】:

    标签: c sizeof


    【解决方案1】:

    你有一个指向字符的指针数组。数组的总大小为

    <number of elements> * <number of bytes for a char pointer>
    

    其中一个成员的大小是 char 指针的大小(在您的系统上为 8 个字节)。这给了你:4*sizeof(char *)/sizeof(char *) 数组中元素的数量。

    要查看位置 0 处字符串的 长度,您需要:

    strlen(states[0]);
    

    这将为您提供您所期望的 10 个。

    【讨论】:

    • 哦,对了,我现在明白了。非常感谢您的解释,非常有帮助。
    【解决方案2】:

    char *states[] 是一个字符指针数组。所以 sizeof 数组的任何元素都会给出一个指针的大小,在你的例子中恰好是 8 个字节。

    【讨论】:

      【解决方案3】:

      这是依赖于体系结构的行为。sizeof(states[0]) 是字符指针的大小,因为states[0] 是字符指针。在您的机器大小为char 时,指针恰好是8。因此输出。

      如果你真的想要字符串的大小,那么最好在states[0] 上使用strnlen() 之类的东西。

      【讨论】:

      • 另外请注意,我建议使用 strnlen() 而不是 strlen(),因为 strnlen() 提供了更安全的解决方案。
      • strnlen 如何更安全?如果字符串格式错误或指针错误,strlen 将安全崩溃,或者为您提供正确的结果。如果字符串格式错误或指针错误,strnlen 将崩溃,给你一个正确的结果或给你一个截断的结果。添加一个可能被截断的不正确结果如何使任何事情更安全?
      • @Art 我的意思是,如果你没有得到一个 NULL 终止的字符串,你就不会陷入无限循环。在没有适当的 NULL 终止的情况下很容易传递一个字符串。 scanf 中的示例,您最终可能会读取没有 NULL 终止的字符串。使用截断的字符串而不是崩溃更好。
      【解决方案4】:
      I'm a little confused, why is sizeof(states[0]) 8 bytes?
      

      因为 states 是一个 char 指针数组。

      所以,states[0] 是数组的第一个元素,在你的机器上我认为地址是 8 个字节。

      这就是你收到8的原因

      【讨论】:

        猜你喜欢
        • 2021-09-22
        • 2020-10-18
        • 2015-11-26
        • 1970-01-01
        • 2015-12-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-20
        相关资源
        最近更新 更多