C语言;VS Code;C++;

C语言遇到的问题

问题详述

下面这个,我觉得D对,但是不知道c哪里不对,于是上手敲了代码,结果C选项的表达式在不同编译器里面输出的还是不一样的!!
① 在VS Code中,输出的是0,为什么啊?我觉得会返回a[2][1]的,为什么会输出0啊?
② 在VC++ 6.0中,输出的是一个地址,为什么啊?

img

代码

#include"stdio.h"
int main(){
    int a[3][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}};
    int (*p)[4]=a;
    int i,j,k=0;
    printf("%d \n",*(p+2)[1]); 
    return 0;
}

VS Code运行结果图

img

VC++ 6.0运行结果图

img


*(p+2)[1],这个就是随机值,其值是未知的!
[]这个优先级是高于*号的,要想正确访问到元素应该这样(*(p+2))[1]访问到第三行第二个元素
或者*(*(p+2)+1)效果一样

那不是一个有效的地址,所以结果是随机的。

优先级问题导致的访问到没有定义的空间,而0的话是恰巧,就是一个随机值

【以下回答由 GPT 生成】

答案:

在C语言中,数组名本身可以被解释为指向该数组首元素的指针。因此,a在表达式中可以被解释为指向a数组第一行的指针。在这个例子中,p是一个指向有4个整数的数组的指针,指向a第一行。

在这段代码中,*(p+2)[1]的意思是先将p右移两行,然后取第三行的首元素(也就是数组{8,9,10,11}的首元素),最后得到该元素的值。

然而,在C语言中,优先级规则使得数组下标操作符[]比指针引用操作符*的优先级更高。因此,*(p+2)[1]会被解释为*((p+2)[1]),先将p右移两行,然后取第三行的首元素,这个元素是一个数组,因此它会被解释为指向这个数组的指针。最后,表达式取这个指针的值,也就是输出指向数组的地址。

在不同编译器中,优先级的解释可能会有所不同,这导致了不同编译器中代码的输出结果不一致。

为了解决这个问题,可以使用括号明确指定运算的优先级,将表达式改为*(*(p+2)+1),这将首先将p右移两行,然后取第三行的首元素,最后取该元素的值。这样就能获得期望的结果。

以下是修复后的代码:

#include<stdio.h>
int main(){
    int a[3][4]={ {0,1,2,3},{4,5,6,7},{8,9,10,11}};
    int (*p)[4]=a;
    int i,j,k=0;
    printf("%d \n",*(*(p+2)+1)); 
    return 0;
}

希望能解决你的问题!如果有任何其他问题,请随时问我。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^