访问二级指针,段错误

    int aa[6][6] = {0};
    int **pp = aa;
    int (*pl)[1];
    pl = aa;
    
    int a[6] = {0};
    int *p = a;
    
    
    printf( "%d\n", *p );
    printf( "%d\n", **pl );  // 正常
    printf( "%d\n", **pp ); // 报错

一级指针访问没问题,二级就报错

阅读 3.4k
2 个回答

这段代码是无法clean compile的。int **pp = aa 会warning。因为**paa是不兼容的类型。

这个会把aa数组的起始地址付给p。但是这个地址存放的值是0。然后0这个地址会被访问 **pp。就会出现segmentfault.

C 语言里的多维数组,本质上是『数组的数组』。也就是说,aa 本质上是一个一维数组,只不过它的元素也是数组。由于一维数组与指针的关系很暧昧,所以可以认为 aa 存储的是一组 int * 类型的指针。

如果像下面这样声明 pp,虽然编译器(我用的 gcc)会给出警告,但是后面的打印结果没问题。

int *(*pp)[] = aa;

这个声明的意思是,pp 是指向数组的指针,而这个数组里的元素都是 int * 类型的指针。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进