2
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。背后的原因是什么?我声明的字符串是如何存储在内存中的?

4

3 回答 3

1

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

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

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

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

但是你会得到“threefour”。

于 2013-08-27T19:40:28.483 回答
1

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

对于第一个,您有 5 个 [5] 字节的字符串:

 "one__two__threefour_five_"

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

于 2013-08-27T19:39:45.200 回答
1

第一种情况,您使用的是二维数组,每个元素的数组大小为 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]);
于 2013-08-27T19:33:54.403 回答