我爱橙 发表于 2022-3-12 16:34:07

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;
}

傻眼貓咪 发表于 2022-3-12 17:24:45

视编译器不同结果,如 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]
查看完整版本: NO.17 EX11.10 非法引用数组元素