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

这篇具有很好参考价值的文章主要介绍了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;
}

运行结果如下:文章来源地址https://www.toymoban.com/news/detail-476412.html

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

到了这里,关于C++结构体内有指针,直接赋值报Segmentation fault原因分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Linux】调试常见的应用程序奔溃“Segmentation fault (core dumped)”

    Linux程序开发者,日常遇到程序奔溃时,应该如何调试,如何寻找原因和解决呢?本文就介绍了遇到Segmentation fault (core dumped)问题时最常规的定位方法。 当你在命令行执行一个程序时,遇到Segmentation fault (core dumped)后,第一时间查看当前目录下是否产生了core-xxxxx文件。 如果没

    2024年02月10日
    浏览(33)
  • 问题记录 | 执行python命令报错 713011 segmentation fault (core dumped) python

    最近在看DALLE2模型,新建conda虚拟环境之后使用命令 pip install dalle2_pytorch 安装,然后在MobaXterm中执行python命令,报错 但是在vscode中同样的命令能够顺利执行

    2024年02月13日
    浏览(31)
  • 【Q&A】Python代码调试之解决Segmentation fault (core dumped)问题

    Python3执行某一个程序时,报Segmentation fault (core dumped)错,且没有其他任何提示,无法查问题。 Segmentation fault (core dumped)多为内存不当操作造成。空指针、野指针的读写操作,数组越界访问,破坏常量等。对每个指针声明后进行初始化为NULL是避免这个问题的好办法。排除此问题

    2023年04月21日
    浏览(29)
  • 记录关于智能家居的路程的一个bug___Segmentation fault(段错误)

    其实发生段错误的情况有很多: 其实在项目的开发中最有可能的错误就是①和②,考虑到本项目数组用的比较少,所以主要是考虑错误①指针的误用。 有时候错误就是那么离谱,声音也算是一种设备????? 有时候又没有段错误 怀疑是多线程的问题,把线程一个一个注释

    2024年04月15日
    浏览(27)
  • 64位AT&T汇编语言as汇编ld链接,执行报错Segmentation fault

    absCallAndPrintAbsAsLd.s 里边的内容如下: as -g absCallAndPrintAbsAsLd.s -o absCallAndPrintAbsAsLd.o 进行汇编。 ld -g absCallAndPrintAbsAsLd.o -o absCallAndPrintAbsAsLd -lc -I /usr/lib64/ld-linux-x86-64.so.2 进行链接。 ./absCallAndPrintAbsAsLd 执行报错 Segmentation fault 。 我把 rsp 中的地址加上8之后,就不报错了,因为这

    2024年01月24日
    浏览(32)
  • swc-loader Segmentation fault “$NODE_EXE“ “$NPM_CLI_JS“ “$@“

    webpack + swc swc还不是很稳定。 在swcrc 中有配置plugins 时,swc 转换 /node_modules/ 会报错。 @swc/cor@1.3.62 swc-loader@0.2.3 swc-plugin-vue-jsx@0.2.5 配两套rule,一套处理项目代码,一套处理node_modules webpack.config.js swcrc mode: entry 稳定一点。用usage会出问题。 果然是experimental.plugin, 实验性featur

    2024年02月11日
    浏览(36)
  • C++写文件,直接写入结构体

    以前写文件都是写入字符串或者二进制再或者就是一些配置文件,今天介绍一下直接写入结构体,可以在软件参数较多的时候直接进行读写, 直接将整个结构体写入和读取 ,看代码: 代码虽然简单,但是足以说明问题。 运行结果如下:

    2024年02月12日
    浏览(28)
  • C++教程——const修饰指针、结构体、文件操作

    读取数据的方式 写文件 读文件

    2024年02月13日
    浏览(29)
  • 不能直接把字符串赋值给字符数组

    在C语言中,使用赋值操作符直接将字符串赋值给字符数组是一种特殊的用法。当使用赋值操作符将字符串赋值给字符数组时,编译器会自动将字符串的字符逐个拷贝到字符数组中,并在最后自动添加一个空字符( \\0 )作为字符串的结束符。 例如,您提到的 char name[10] = \\\"hel

    2024年02月11日
    浏览(32)
  • 《C和指针》笔记16:赋值容易出现的误区: 赋值截短

    在下面的语句中,认为a和x被赋予相同的值的说法是不正确的: 它等价于 如果x是一个字符型变量,那么y+3的值就会被截去一段 ,以便容纳于字符类型的变量中。那么 a所赋的值就是这个被截短后的值 。在下面这个常见的错误中,这种截短正是问题的根源所在: EOF需要的位数

    2024年02月10日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包