C++结构体内有指针,直接赋值报Segmentation fault原因分析

最近写程序的时候,用了别人定义好的结构体,结构体的成员变量包含指针,直接赋值后运行报段错误。下面对这个问题进行一下分析。

1. 结构体的情况分析

首先直接原因是在声明一个结构体时,如果成员变量中包含指针,计算机并不为其分配指针指向内容的内存空间,而仅仅只分配指针本身大小的内存空间,也就是4个字节(32位系统)。所以直接进行赋值操作时,指针指向的内容并没有被分配空间,所以就会报段错误。演示代码如下:

#include <iostream>
using namespace std;

struct A{
    public:
        int a;
};


struct B{
    public:
        int b;
        A* temp;
};

int main(){
    
    A a1;
    a1.a = 5;
    cout << "a1.a = " << a1.a << endl;

    B b1;
    b1.b = 1;
    cout << "b1.b = " << b1.b << endl;
    b1.temp->a = 6;
    cout << "b1.temp->a = " << b1.temp->a << endl;

    // b1.temp = new A();
    // b1.temp->a = 6;
    // cout << "b1.temp->a = " << b1.temp->a << endl;


    return 0;
}

编译后运行,输出结果为:

a1.a = 5
b1.b = 1
Segmentation fault (core dumped)

根据上面的分析,需要在B的实例化b1的基础上,给其成员变量中的指针分配空间。修改如下:

int main(){
    
    A a1;
    a1.a = 5;
    cout << "a1.a = " << a1.a << endl;

    B b1;
    b1.b = 1;
    cout << "b1.b = " << b1.b << endl;
    // b1.temp->a = 6;
    // cout << "b1.temp->a = " << b1.temp->a << endl;

    b1.temp = new A();
    b1.temp->a = 6;
    cout << "b1.temp->a = " << b1.temp->a << endl;


    return 0;
}

增加了一行代码

 b1.temp = new A();

编译后运行,输出结果为:

a1.a = 5
b1.b = 1
b1.temp->a = 6

2. 类的情况分析

这里做了一点关联的想法。其实c++中后来多用class了,那么使用类替换结构体能否解决上面的问题呢,其实是可以的。在类的默认构造函数中,增加对指针成员变量的内存分配,就可以避免在后面使用时手动分配内存,实际上是把分配内存的动作前移

演示代码如下:

class A{
    public:
        int a;
    
    A(){
        a = 0;
    }
};


class B{
    public:
        int b;
        A* temp;
    
    B(){
        b = 0;
        temp = new A();
    }
};


int main(){
    
    A a1;
    a1.a = 5;
    cout << "a1.a = " << a1.a << endl;

    B b1;
    b1.b = 1;
    cout << "b1.b = " << b1.b << endl;
    b1.temp->a = 6;
    cout << "b1.temp->a = " << b1.temp->a << endl;

    // b1.temp = new A();
    // b1.temp->a = 6;
    // cout << "b1.temp->a = " << b1.temp->a << endl;


    return 0;
}

运行结果如下:

a1.a = 5
b1.b = 1
b1.temp->a = 6
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值