You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何读取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 03:27:39