访问二级指针,段错误
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
这段代码是无法clean compile的。
int **pp = aa
会warning。因为**p
和aa
是不兼容的类型。这个会把
aa
数组的起始地址付给p
。但是这个地址存放的值是0。然后0这个地址会被访问**pp
。就会出现segmentfault.C 语言里的多维数组,本质上是『数组的数组』。也就是说,
aa
本质上是一个一维数组,只不过它的元素也是数组。由于一维数组与指针的关系很暧昧,所以可以认为aa
存储的是一组int *
类型的指针。如果像下面这样声明
pp
,虽然编译器(我用的 gcc)会给出警告,但是后面的打印结果没问题。这个声明的意思是,
pp
是指向数组的指针,而这个数组里的元素都是int *
类型的指针。