鱼C论坛

 找回密码
 立即注册
查看: 2402|回复: 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,但为什么程序可以运行啊?

  1. #include <stdio.h>
  2. #include <math.h>

  3. int main()
  4. {
  5.       int a[2][3],(*pt)[3];
  6.           pt=a;
  7.           
  8.            printf("a=%d\n",a);                                      //a=648755
  9.        printf("pt=%d\n",pt);                                    //pt=6487552
  10.        printf("pt[0][0]=%d\n",pt[0][0]);                  //pt[0][0]=0
  11.       
  12.            printf("*(pt)[2]=%d\n",*(pt)[2]);              //*(pt)[2]=6487552
  13.            printf("*(pt+1)[2]=%d\n",*(pt+1)[2]);     //*(pt+1)[2]=0
  14.           
  15.            printf("*(pt[1])=%d\n",*(pt[1]));             //*(pt[1])=0
  16.            printf("*(pt[1]+2)=%d\n",*(pt[1]+2));    //*(pt[1]+2)=0
  17.           
  18.            printf("*(a[0])=%d\n",*(a[0]));              //*(a[0])=0
  19.        printf("*(a[0]+2)=%d\n",*(a[0]+2));         //*(a[0]+2)=64

  20.         return 0;
  21. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

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

  5.         pt = a;

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

  10.         return 0;
  11. }
复制代码
运行后结果:LLVM - Clang
  1. 1
  2. 1
  3. 6
  4. 3
复制代码
Microsoft MSVC
  1. 1
  2. 5313572
  3. 6
  4. 3
复制代码
gcc 9.2
  1. 1
  2. 0
  3. 6
  4. 3
复制代码
**从以上结果看来,输出的并不是数组里的元素(如题:对 a 数组元素的非法引用)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-16 18:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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