1

谁能给我输出的解释

#include<stdio.h>
int main(void){
    int i;
    char *a[]={ "This is first line",
                "This is second line",
                "This is third line",
                "This is fourth line",
                "This is fifth line",
                "This is sixth line",
                "This is seventh line end"};
    printf("%d\n",sizeof(a));
    printf("%d\n",sizeof(*a[0]));
    for(i=0;i<=sizeof(a[0]);i++){
        printf("%s\n",a[i]);
    }
}

输出:

28
1
This is first line
This is second line
This is third line
This is fourth line
This is fifth line
4

6 回答 6

3

is的类型和*a[0]is的char类型(指针)。a[0]char*

sizeof(char) == 1, sizeof(char*) == 4.

的类型achar*[], sizeof(a) == (7 * sizeof(char*)) == 28

于 2013-10-28T10:02:57.517 回答
3

输出:

28

a是一个由 7 个指针组成的数组;每个指针在您的系统上的大小为 4。因此 28.

1

*a等同于a[0], 所以a[0][0], *a[0],**a并且(*a)[0]都是等价的:它是第一个字符串的第一个字符。

在那之后,你应该得到七行。

This is first line
This is second line
This is third line
This is fourth line
This is fifth line

等等,什么?嗯……

for(i=0;i<=sizeof(a[0]);i++){

对我来说似乎完全错误:

for(i=0;i<sizeof(a)/sizeof(a[0]);i++){

应该更好。为什么?i<=sizeof(a[0])i<=4,给出 5 行。

但是,i<sizeof(a)/sizeof(a[0]);i < 28/4,即 7,是数组中的元素数。

于 2013-10-28T10:10:04.480 回答
2

28 - 尝试打印 sizeof(char*),它将是 4(字节),所以如果你有 7 个字符串文字,你的 char* 指针数组将占用 4*7 = 28 个字节

1 - *a[0] 是数组中第一个指针指定的地址处单个字符的大小。

但是你sizeof(a[0])用来获取字符串数量的奇怪之处。sizeof(a[0]) 等于 sizeof(char*) 又是 4(字节)。所以你的 for 循环将打印出 5 个字符串,因为它等于:

for(i=0;i<=4;i++){

它将运行 0,1,2,3, 4 包括在内。要打印出您应该使用的所有字符串:

for(i=0;i<sizeof(a)/sizeof(char*);i++){
    printf("%s\n",a[i]);
}
于 2013-10-28T10:06:23.440 回答
2

char* a[] 是一个指向字符串的指针数组

sizeof 将给出数组的字节数,但不会告诉有多少个字符指针,要得到你需要将总大小除以一个指针的大小:

sizeof( a ) / sizeof( char * )

另一种方法是在数组中添加一个 NULL 指针

char *a[]={ "This is first line",
            "This is second line",
            "This is third line",
            "This is fourth line",
            "This is fifth line",
            "This is sixth line",
            "This is seventh line end",
            NULL };
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(*a[0]));
for(i=0; a[i] != NULL;i++){
    printf("%s\n",a[i]);
}
于 2013-10-28T10:10:41.763 回答
0

这是一个指针数组。在 32 位机器中,指针大小为 32 位(又名 4 字节)。在第一个 printf() 中,您打印数组内所有指针大小的总和。你有 7 行 -> 7*32 = 224 位 = 28 字节。在第二个 printf() 中,您打印第一行的第一个字符的大小。char 类型是 8 位(又名 1 字节大小)。

于 2013-10-28T10:20:17.497 回答
-1

a 是 7 个字符指针的数组。所以 sizeof(a) 是 7*sizeof(int)=28。
a[0] 是一个字符指针,因此 a[0] (*a[0]) 的值是大小为 1 的字符。a
[0] 也是大小为 4 的 int 类型的字符指针。所以你的循环从 i=0 运行到 i=4。因此打印 5 个字符串。

于 2013-10-28T10:16:44.687 回答