为何读取int*const&会触发段错误?C++代码问题咨询
问题:为何对
int*const&的读取操作会触发段错误? 代码示例
#include <iostream> class X{ int A[3][4] = {0}; public: int*const&p=*A; void print()const{ for(int i=0;i<3;++i){ for(int j=0;j<4;++j){ std::cout << A[i][j] << " , "; } std::cout << "\n"; } } }; int main() { X x; x.p[2] = 3; x.print(); // 此之前一切正常 std::cout << x.p[2] << "\n"; // 读取p触发段错误 }
运行现象
执行代码后,print()正常输出修改后的数组,但执行std::cout << x.p[2]时直接触发段错误:
0 , 0 , 3 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , Segmentation fault
原因分析
问题出在int*const& p = *A这行代码:
*A是二维数组A的第一行,类型是int[4](数组类型),而要绑定的引用类型是int* const&(指向int的常量指针的引用),二者类型不匹配。- 编译器会自动把
int[4]隐式转换为int*(数组退化为指针),这个转换过程会生成一个临时的int*对象,然后把引用p绑定到这个临时对象上。 - 临时对象的生命周期仅在初始化语句结束后就会被销毁,后续访问
x.p时,引用已经指向被释放的内存区域(悬空引用),读取操作自然触发段错误。
改成int*const p = *A后能正常运行的原因是:这里直接把数组退化后的指针值赋值给成员变量p,p本身存储的是A[0]的真实地址,该地址在对象x的生命周期内一直有效,不会出现悬空问题。
解决方案
如果需要给外部接口提供一维数组指针,直接用指针成员而非指针引用即可:
class X{ int A[3][4] = {0}; public: int*const p = *A; // 直接存储指针,而非引用 // ... 其他代码不变 };
内容的提问来源于stack exchange,提问作者user21835096
相关产品推荐
相关产品推荐

