鱼C论坛

 找回密码
 立即注册
查看: 1972|回复: 1

NO.17 EX11.10 非法引用数组元素

[复制链接]
发表于 2022-3-12 16:34:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 我爱橙 于 2022-6-10 16:29 编辑

Q:若有下列定义和语句,则对a数组元素的非法引用是
int a[2][3],(*pt)[3];pt=a;

A.pt[0][0]         //指针变量 pt 指向 a 数组,*pt 相当于 a [0];

B.*(pt+1)[2]    //*(pt + 1) 相当于 a[ 1];*(pt + 1)[2] 相当于 *(pt + 3);* (pt + 3) 等价于 a[3];显然 a[3] 不存在!所以选项 B 非法!

C.*(pt[1]+2)    //

D.*(a[0]+2)    //

答案是B,但为什么程序可以运行啊?
#include <stdio.h>
#include <math.h>

int main()
{
      int a[2][3],(*pt)[3];
          pt=a;
          
           printf("a=%d\n",a);                                      //a=648755
       printf("pt=%d\n",pt);                                    //pt=6487552
       printf("pt[0][0]=%d\n",pt[0][0]);                  //pt[0][0]=0
       
           printf("*(pt)[2]=%d\n",*(pt)[2]);              //*(pt)[2]=6487552
           printf("*(pt+1)[2]=%d\n",*(pt+1)[2]);     //*(pt+1)[2]=0
           
           printf("*(pt[1])=%d\n",*(pt[1]));             //*(pt[1])=0
           printf("*(pt[1]+2)=%d\n",*(pt[1]+2));    //*(pt[1]+2)=0
           
           printf("*(a[0])=%d\n",*(a[0]));              //*(a[0])=0
       printf("*(a[0]+2)=%d\n",*(a[0]+2));         //*(a[0]+2)=64

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-12 17:24:45 | 显示全部楼层
视编译器不同结果,如 gcc 或 MSVC 没有报错,Clang 则警告提示(但可运行):
#include <stdio.h>

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

        pt = a;

        printf("%d\n", pt[0][0]);
        printf("%d\n", *(pt + 1)[2]); // 警告提示 clang-analyzer-core.CallAndMessage: 2nd function call argument is an uninitialized value
        printf("%d\n", *(pt[1] + 2));
        printf("%d\n", *(a[0] + 2));

        return 0;
}
运行后结果:LLVM - Clang
1
1
6
3
Microsoft MSVC
1
5313572
6
3
gcc 9.2
1
0
6
3
**从以上结果看来,输出的并不是数组里的元素(如题:对 a 数组元素的非法引用)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-28 16:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表