NO.17 EX11.10 非法引用数组元素
本帖最后由 我爱橙 于 2022-6-10 16:29 编辑Q:若有下列定义和语句,则对a数组元素的非法引用是
int a,(*pt);pt=a;
A.pt //指针变量 pt 指向 a 数组,*pt 相当于 a ;
B.*(pt+1) //*(pt + 1) 相当于 a[ 1];*(pt + 1) 相当于 *(pt + 3);* (pt + 3) 等价于 a;显然 a 不存在!所以选项 B 非法!
C.*(pt+2) //
D.*(a+2) //
答案是B,但为什么程序可以运行啊?
#include <stdio.h>
#include <math.h>
int main()
{
int a,(*pt);
pt=a;
printf("a=%d\n",a); //a=648755
printf("pt=%d\n",pt); //pt=6487552
printf("pt=%d\n",pt); //pt=0
printf("*(pt)=%d\n",*(pt)); //*(pt)=6487552
printf("*(pt+1)=%d\n",*(pt+1)); //*(pt+1)=0
printf("*(pt)=%d\n",*(pt)); //*(pt)=0
printf("*(pt+2)=%d\n",*(pt+2)); //*(pt+2)=0
printf("*(a)=%d\n",*(a)); //*(a)=0
printf("*(a+2)=%d\n",*(a+2)); //*(a+2)=64
return 0;
} 视编译器不同结果,如 gcc 或 MSVC 没有报错,Clang 则警告提示(但可运行):#include <stdio.h>
int main() {
int a = { {1, 2, 3}, {4, 5, 6} };
int (*pt);
pt = a;
printf("%d\n", pt);
printf("%d\n", *(pt + 1)); // 警告提示 clang-analyzer-core.CallAndMessage: 2nd function call argument is an uninitialized value
printf("%d\n", *(pt + 2));
printf("%d\n", *(a + 2));
return 0;
}运行后结果:LLVM - Clang1
1
6
3Microsoft MSVC1
5313572
6
3gcc 9.21
0
6
3**从以上结果看来,输出的并不是数组里的元素(如题:对 a 数组元素的非法引用)
页:
[1]