-1

这是微软测试的一个问题:

 main()
    {
        int a[2][3]= { (1,2,3),(4,5,6)};
        int (*ptr)[3] = &a[0];
        printf("%d %d\n", (*ptr)[1],(*ptr)[2]);
        ptr+=1;
        printf("%d %d\n", (*ptr)[1],(*ptr)[2]);

    }

给出的选项是:

  1. 分段故障
  2. 编译器错误
  3. 总线错误
  4. 运行时错误

我运行了这段代码,但没有得到任何结果。我得到以下答案:

6 0   
0 0   

你能帮我理解发生了什么吗?

4

2 回答 2

8

主要问题是这一行:

    int a[2][3]= { (1,2,3),(4,5,6)};

它使用括号而不是大括号。(1,2,3) 的结果是 3,而 (4,5,6) 的结果是 6。所以这相当于:

    int a[2][3]= { 3,6 };

这又相当于

    int a[2][3] = { {3,6,0}, {0,0,0} };

此行使 ptr 指向 a[0]:

    int (*ptr)[3] = &a[0];

这条线

    printf("%d %d\n", (*ptr)[1],(*ptr)[2]);

那么等价于

    printf("%d %d\n", (*&a[0])[1],(*&a[0])[2]);

可以简化为

    printf("%d %d\n", (a[0])[1],(a[0])[2]);

要不就

    printf("%d %d\n", a[0][1],a[0][2]);

这条线

    ptr+=1;

使 ptr 指向 a 的下一个元素,所以它等价于

    ptr=&a[1];

所以下一行简化为

    printf("%d %d\n", a[1][1],a[1][2]);

该程序有效地打印 a[0][1]、a[0][2]、a[1][1] 和 a[1][2],这就是为什么你得到 6,0,0,0。

Charles Baley 指出 main() 缺少返回类型。这可能就是他们的目的。编译器通常至少会对此发出警告。

于 2012-09-25T05:27:28.983 回答
2

你确定你复制的文字正确吗?

(1,2,3)是具有两个序列或逗号 ( ,) 运算符的表达式;它的值为 3。同样, 的值为(4,5,6)6。这是正在打印的 6 a[0][1](因为 ptr 指向a[0]并且您打印(*ptr)[1]);0 是a[0][2],它的默认初始化为 0。然后你递增ptr,将它指向a[1],所以你打印a[1][1]and a[1][2],它的默认初始化也为 0。

于 2012-09-25T05:38:09.100 回答