C/C++ 错误笔记-在给结构体中的指针赋值时,要注意该指针是否已指向内存空间

先来看下面的例子:

复制代码
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

#pragma warning(disable:4996)

typedef struct _Student
{
    char name[64];
    int age;

}Student;


typedef struct _Teacher
{
    char name[64];
    int age;
    char *p1;
    char **p2;
    Student s1;
    Student *ps1;

}Teacher;



int main()
{

    Teacher t1;
    t1.age = 30;
    t1.s1.age = 20;

    // 操作结构体中的结构体指针
    t1.ps1->age = 100;

    system("pause");
    return 0;
}
复制代码

编译,没有问题,但是一运行,程序直接报错

问题出现在

t1.ps1->age = 100; 这一行,因为我们在给结构体指针Student的age属性赋值时,并未给ps1指针开辟内存空间,所以相当于给一个空指针赋值,因此程序crash掉了。

下面是修改后的代码:

复制代码
int main()
{

    Teacher t1;
    Student s1;
    t1.age = 30;
    t1.s1.age = 20;

    // 操作结构体中的结构体指针
    t1.ps1 = &s1;
    t1.ps1->age = 100;

    system("pause");
    return 0;
}
复制代码

我们在给ps1的age属性赋值时,已为ps1指向了一块内存空间,这样程序就不会再crach了。因此在使用指针时需要记得一句话:

没有内存,哪来的指针? 



如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
posted @   夜行过客  阅读(9851)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示