【问题标题】:Size of String in C 64 bit machineC 64位机器中字符串的大小
【发布时间】:2013-08-27 19:29:00
【问题描述】:
char Str[][5]={"one","two","three","four","five"};
char Str1[][6]={"one","two","three","four","five","six"};

printf("Size of Str is %d",sizeof(Str));
printf("\nSize of Str1 is %d",sizeof(Str1));
//Compile on Cygwin 64 bit on windows 64bit machine

当我检查 Str 和 Str1 的大小时,我分别得到了 25 和 36。 背后的原因是什么?我声明的字符串是如何存储在内存中的?

【问题讨论】:

    标签: c string 64-bit arrays c-strings


    【解决方案1】:

    无论初始数据的长度如何(假设您没有超出数组的大小),您都会为每个字符串分配固定的数量 - 这就是您所得到的。

    第一个有 5 个 [5] 个字节的字符串:

     "one__two__threefour_five_"
    

    其中“_”是字符串之间的未初始化字节。 5x5 = 25 个字节。 (同样适用于 36 字节数组)。

    【讨论】:

    • 只有 _ 在 't' 字符之前是未初始化的字节,其余的 _ 是 '\0' 字节
    • 啊,确实如此 - 字符串将以零结尾 - 有空间(在“一”、“二”、“四”和“五”之后)。谢谢
    【解决方案2】:

    这些是二维字符数组,而不是一个字符串数组。

    我声明的字符串是如何存储在内存中的?

    很糟糕。例如,第一个数组中的每个元素占用 5 个字节。你认为如果你这样做,你会得到“三个”

    printf ("%s\n", Str[2]);
    

    但是你得到的是“threefour”。

    【讨论】:

      【解决方案3】:

      第一种情况,您使用的是二维数组,每个元素的数组大小为 5。所以总计 size=(maximum size of array element)*(number of array elements) i,e) 5*5=25.

      类似的第二种情况也是二维数组,每个元素的数组大小为 6。所以总计 size=(maximum size of array element)*(number of array elements) `i,e) 6*6=3。

      下面部分代码显示了字符串的排列方式。

      for(i = 0; i<5; i++)
          printf("%s\n", Str[i]);
      

      【讨论】:

        猜你喜欢
        • 2011-02-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-02
        • 1970-01-01
        • 2019-08-21
        相关资源
        最近更新 更多