最近写程序的时候,用了别人定义好的结构体,结构体的成员变量包含指针,直接赋值后运行报段错误。下面对这个问题进行一下分析。
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了,那么使用类替换结构体能否解决上面的问题呢,其实是可以的。在类的默认构造函数中,增加对指针成员变量的内存分配,就可以避免在后面使用时手动分配内存,实际上是把分配内存的动作前移。
演示代码如下:文章来源:https://www.toymoban.com/news/detail-476412.html
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;
}
运行结果如下:文章来源地址https://www.toymoban.com/news/detail-476412.html
a1.a = 5
b1.b = 1
b1.temp->a = 6
到了这里,关于C++结构体内有指针,直接赋值报Segmentation fault原因分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!