访问二级指针,段错误

发布于 2022-09-02 16:07:04 字数 268 浏览 14 评论 0

    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 ); // 报错

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

反目相谮 2022-09-09 16:07:04

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

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

乖乖 2022-09-09 16:07:04

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

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

int *(*pp)[] = aa;

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文