C语言——内存管理问题

2023-05-16

常见的内存错误及解决方法

一、结构体成员指针未初始化
eg:

#include <stdio.h>
#include <string.h>

struct student
{
	char *name;
	int score;
}stu,*pstu;

int main()
{
	strcpy(stu.name,"pddddd");
	stu.score=99;
	printf("%s\n",stu.name);
	printf("%d\n",stu.score);
	return 0;
}

运行结果:
在这里插入图片描述
原因分析:
答:定义的结构体变量stu分配了char *类型的指针和int类型整形变量;结构体中的字符指针name没有指向合法的地址。

解决方法:
答:在使用时为字符串指针name动态开辟空间。

#include <stdio.h>

struct student
{
    char *name;
    int score;
}stu,*pstu;

int main()
{
    stu.name=(char *)malloc(8);
    strcpy(stu.name,"pddddd");
    printf("%s\n",stu.name);

}

二、没有为结构体指针分配足够的内存

#include <stdio.h>

struct student
{
    char *name;
    int score;
}stu,*pstu;   			//定义了结构体指针变量

int main()
{
    pstu=(struct student *)malloc(sizeof(struct student));	//为结构体指针开辟空间
    pstu->name=(char *)malloc(8);
    strcpy(pstu->name,"pddddddd");
    printf("%s\n",pstu->name);

}

三、函数的入口校验
1.指针在定义时初始化为NULL;
2.在函数入口使用assert(NULL!=p)对参数进行校验。在非参数的地方使用if(NULL!=p)来校验。

四、为指针分配的内存太小

#include <stdio.h>
#include <string.h>
int main()
{
    char *p1="abcdefg"; //长度为8
    char *p2=(char *)malloc(sizeof(char)*strlen(p1)+1*sizeof(char));    //strlen计算昌都市没有包含'\0',需要手动加上
    strcpy(p2,p1);
    printf("%s\n",p2);
}

注意:
只有字符串常量才有结束标志符。
比如下面这种写法就没有结束标志符了:chara[7]={‘a’,’b’,’c’,’d’,’e’,’f’,’g’};

五、内存分配成功,但并未初始化
对于还不确定初值的变量初始化

int i=0;
char *p=NULL;
int a[10]={0};memset(a,0,sizeof(a));

六、内存越界
eg:

int a[10]={0};
for(i=0;i<=10;i++)     //此时有11个数字,发生了越界
{
	a[i]=i;
}

七、内存泄漏
问题出处:堆上由malloc或new操作符分配的内存
解决办法:使用完后及时free或delete,否者这块内存将无法释放,知道整个程序终止

八、malloc函数用法
使用要求:
1.内存分配的对象
2.分配的内存大小
3.是否还有足够内存分配
4.内存将用来存储什么格式的数据
5.分配好的内存存在哪里

void *malloc(int size);
返回值:一个void类型的指针
参数:int类型,即申请分配的内存的大小,单位是byte

内存分配成功后,malloc函数返回内存的首地址,需要一个指针来接受这个地址,但需要对指针的返回值进行强制转换
eg:

char *p=(char *)malloc(100)
可通过指针p来操作这块内存(匿名访问),malloc申请的是一块连续的内存

注:若申请分配的内存大于剩余的内存,即分配失败,函数会返回NULL。若申请的是0字节的内存,虽然返回一个正常的内存地址,但无法使用。

九、内存释放
使用free( )函数释放
功能:斩断内存和指针的关系,指针变量本身保存的地址不变,但它对这个地址处的那块内存没有使用权。
注意:释放完后,需要重新给指针定义为NULL

十、内存已经被释放了,但是继续通过指针来使用
①free(p)之后,继续通过p指针来访问内存。解决的办法就是给p置NULL。
②函数返回栈内存
③内存使用太复杂,弄不清到底哪块内存被释放,哪块没有被释放。解决的办法是重新设计程序,改善对象之间的调用关系。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言——内存管理问题 的相关文章

  • php curl函数应用方法之模拟浏览器

    curl 是使用URL语法的传送文件工具 xff0c 支持FTP FTPS HTTP HTPPS SCP SFTP TFTP TELNET DICT FILE和LDAP curl 支持SSL证书 HTTP POST HTTP PUT FTP
  • WireShark基本抓包数据分析

    WireShark抓包数据分析 xff1a 1 TCP报文格式 源端口 目的端口 xff1a 16位长 标识出远端和本地的端口号 顺序号 xff1a 32位长 表明了发送的数据报的顺序 确认号 xff1a 32位长 希望收到的下一个数据报的
  • VScode下运行调试C++文件

    1 下载vscode 这个可以直接去官网下载 2 下载mingw64 下载mingw64就是下载C 43 43 的编译器g 43 43 和调试器gdb 这个也可以去官网下载 xff0c 下载安装完成后去配置环境变量 我将mingw64安装在
  • c++模板的优点和缺点

    作为C 43 43 语言的新组成部分 xff0c 模板引入了基于通用编程的概念 通用编程是一种无须考虑特定对象的描述和发展算法的方法 xff0c 因此它与具体数据结构无关 但在决定使用C 43 43 模板之前 xff0c 让我们分析一下使用
  • 基于导航网格的A星寻路(Navigation mesh)

    最近花了几个月的时间实现了导航网格寻路和导航网格自动生成 导航网格数据结构定义 由于数据之间有着层级关系 xff0c 所以采用XML进行定义 navmesh基本元素 xff1a 顶点 Verts 43 可走边 Edges 43 凸多边形 P
  • cmake 引入 动态库、静态库

    动态库 xff1a link directories PROJECT SOURCE DIR lib 添加动态连接库的路径 target link libraries project name lMNN 添加libMNN so 静态库 xff
  • 利用JSP内置对象Request和Application实现用户名密码登录注册进入首页显示

    学习目标 xff1a 实验名称 xff1a JSP内置对象目的 xff1a 掌握JSP页面的全部语法 能够编写基本的JSP网页 学习内容 xff1a 1 实验 地点 周三2单元 xff0c 10617综合一实验室 自带电脑 目的 掌握各种内
  • 【如何写CMake】一个解决方案,多个工程

    文章目录 代码参考 一个解决方案 xff0c 多个工程 xff0c 即多个exe dll lib等 代码 多加几个ADD EXECUTABLE即可 1 cmake verson xff0c 指定cmake版本 cmake minimum r
  • 指针、寄存器、位操作

    定义寄存器的绝对地址 xff0c 并转换为指针进行位操作 1 位操作示例一 define PERIPH BASE unsigned int 0x40000000 define APB2PERIPH BASE PERIPH BASE 43 0
  • 详解TCP连接的建立

    TCP首部格式 TCP报文段首部的前20个字节是固定的 xff0c 后面有4N字节是根据需要而增加的选项 xff0c 因此TCP报文段的最小长度为20字节 首部固定部分的各字段的意义如下 xff1a 1 源端口和目的端口 xff1a 加上I
  • printf打印函数的原理浅析

    printf的底层原理浅析 目录 printf的底层原理浅析前言函数变参格式解析一个简单的printf示例结语 补充 前言 最近在学习linux内核的时候用到了自定义实现的printf xff0c 学习了一下 xff0c 在此记录 xff0
  • 基于公开网站挖掘敏感信息的研究与分析- Fofa 搜索

    基于公开公开网站挖掘敏感信息的研究与分析 Fofa 搜索 一 引言 1 1项目概述 基于公开网站的敏感信息挖掘研究与分析 xff1a 针对目前网络安全整体的趋势我们从google等搜索引擎 Github等代码库 FOFA等空间搜索这三个方面
  • HTTP报文

    一 HTTP报文的结构 用于HTTP协议交互的信息 xff0c 称为HTTP报文 客户端的HTTP报文称为请求报文 xff0c 服务端的称为响应报文 HTTP报文结构如下图 xff1a 下面是请求报文的一个实例 xff1a 请求行 xff1
  • 用C++写一个UDP发送和接收程序

    发送程序Sender cpp include lt stdio h gt include lt string gt include lt iostream gt include lt winsock h gt using namespace
  • STM32自学笔记(五)串口通信

    xff08 想要深入理解就把前面的看下 xff0c 否则直接看使用总结即可 xff09 usart文件夹 usart 文件夹内包含了 usart c和usart h两个文件 这两个文件用于串口的初始化和中断接收 代码只针对了串口1 xff0
  • sockaddr_in详解

    struct sockaddr in short sin family Address family一般来说AF INET xff08 地址族 xff09 PF INET xff08 协议族 xff09 unsigned short sin
  • ubuntu下好用的TCP/UDP调试工具

    github官方链接 GitHub s kyo mNetAssist mNetAssist A UDP TCP Assistant 编译好的安装包 ubuntu下好用的TCP UDP调试工具 网络设备文档类资源 CSDN下载 1 解压dpk
  • Linux网络编程之connect函数分析

    在一个 CLIENT SERVER模型的网络应用中 xff0c 客户端的调用序列大致如下 xff1a socket gt connect gt recv send gt close 其中socket没有什么可疑问的 xff0c 主要是创建一
  • linux route 命令

    显示现在所有路由 route n root 64 Ubuntu route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 10
  • 大量LAST_ACK 分析过程

    记录一下自己的思想过程 现象 在netstat的时候发现大量处于LAST ACK状态的TCP连接 xff0c 达到在ESTABLISHED状态的90 以上 root 64 ccsafe netstat ant fgrep 34 34 cut

随机推荐

  • const 与重载

    const到底是不是一个重载的参考对象 xff0c 请看下面的例子 class A public void f int i std cout lt lt 34 1 34 函数1 void f int i const std cout lt
  • 指向成员函数的指针

    指向成员函数的指针 取一个非静态成员函数的地址 xff0c 如果该函数是nonvirtual xff0c 则得到的结果是它在内存中真正的地址 然而这个值也不是完全的 xff0c 它也需要被绑定于某个class object的地址上 xff0
  • rviz 远程显示及控制移动机器人的导航

    环境 xff1a xff08 1 xff09 虚拟机本地端IP 192 168 10 30 xff08 虚拟机需要通过桥接的形式与PC本地机连接 xff0c PC 机IP 192 168 10 21 xff09 xff08 2 xff09
  • iptables - administration tools for packet filtering and NAT

    2 iptables administration tools for packet filtering and NAT Linux Iptables Manual Incoming Traffic V 43 43 PREROUTING 4
  • C++ 内部类、嵌套类

    1 嵌套类 nested class 一个类可以定义在另一个类的内部 xff0c 前者称为嵌套类 xff0c 嵌套类时一个独立的类 xff0c 和外层类基本没什么关系 它通过提供新的类型类作用域来避免名称混乱 嵌套类必须声明在类的内部 xf
  • SONY VAIO P VPCP118KJ索尼酷袋本 鸡肋上网本初体验

    随着消费者市场需求的不断多样化和个性化 xff0c 个人电脑厂家开始不断突破创新 xff0c 在产品线拼装出各种各样的个人电脑 xff0c 主打性能的游戏本 xff0c 主打便携轻薄本 xff0c 2009年的CES上索大法推出了一款与众不
  • 第2课【CMSIS和标准库开发】标准库 CMSIS 分层

    目录 基本知识框架课堂笔记CMSISCMSIS的分层关系和作用CMSIS层文件结构内核函数层文件外设函数访问层文件 标准库开发标准库开发 LED GPIO标准库开发 KEY GPIO标准库开发 位带操作位带位带位带别名区位带区和位带别名区的
  • 第4课【STM32的时钟】时钟 时钟源 内外部时钟 高低速时钟

    目录 基本知识框架课堂笔记时钟什么是时钟 xff1f 时钟有什么作用 时钟源HSE 外部高速时钟HSI 内部高速时钟LSE 外部低速时钟LSI 内部低速时钟PLL锁相环 主要时钟和其他时钟主要时钟其他时钟 配置系统时钟实验 基本知识框架Xm
  • 第7课【SysTick定时器】中断 系统定时器 寄存器

    目录 基本知识框架课堂笔记SysTick定时器简介什么是SysTick定时器SysTick定时器的作用 SysTick寄存器CTRL控制及状态寄存器LOAD重装载数值寄存器VALUE当前数值寄存器CALIB校准数值寄存器 SysTick实战
  • 第8课【通讯的基本概念】串行并行 单工半双工全双工 同步异步 比特率波特率

    目录 基本知识框架课堂笔记通讯传送方式串行通讯并行通讯串行通讯与并行通讯的特性 通讯方向单工通讯半双工通讯全双工通讯 同步方式同步通讯异步通讯同步通讯与异步通讯的区别 传输单位比特率波特率比特率和波特率的联系 通讯简介通讯标准 基本知识框架
  • 嵌入式宏定义中do...while(0)的意义

    目录 背景do while 0 形式宏定义使得宏定义拥有一些函数的特点 分析1 封装 xff1a 使得宏定义可以包含复杂的内容而不容易出错 xff0c 提高代码健壮性2 生命周期 xff1a 宏定义内 外部定义的同名变量不会冲突3 返回 x
  • 第9课【USB协议】USB总线 接口 端点 管道 数据包 枚举 STM32_USB-FS-Device_Lib V4.1.0

    目录 简介背景特点版本 数据流模型总线拓扑结构主 从设备通信流端点管道 物理层接口类型USB Type AUSB Type BUSB Type C 引脚定义4PIN9PIN5PIN24PIN16PIN6PIN 电平标准 协议层 通讯方式通讯
  • 第10课【STM32 USB通讯协议实战】HID键盘+CDC虚拟串口组合设备

    目录 前言USB设备类别未定义设备设备描述符 配置描述符分析配置从机类型配置设备专用的描述符配置从机端点实现设备类特定请求 HID设备特点HID键盘描述符实例HID报文描述符短条目报文生成HID键盘报文描述符实例总结 CDC设备特点CDC
  • 创建 std_srvs::Empty 型 Service (参数为空的服务)

    参考 xff1a ros NodeHandle advertiseService API docs 1 包含头文件 include lt std srvs Empty h gt 2 创建服务 xff0c 并绑定服务的回调函数 restart
  • stm32串口+DMA环形缓冲收发保姆级

    基于HAL库的STM32串口DMA环形缓冲收发实例 首先在此感谢开源项目 xff0c 以及大佬们的无私奉献 xff0c 让每一个逐梦人能够免费学习 xff0c 再次感谢 xff01 发布只为记录 xff0c 记性不够 xff0c 笔记来凑
  • NX串口通讯windows

    我用windows与NX进行通讯 xff0c 用的线是CH340下载线 USB端连接windows xff0c 绿色的TXD连接NX的10号 RXD xff0c 白色的RXD连接NX的8号 TXD 目录 1 windows端 2 NX端 2
  • 串口接收 DMA FIFO 双缓冲区配置 + 单色OLED屏幕灰度图像显示的抖动算法

    适用于单色OLED屏幕图像显示的抖动算法 Visual studio c 43 43 STM32F4070 96寸单色IIC通信OLED5级灰度串口DMA 双缓冲github 抖动算法原理 DITHER抖动算法是指灰度可以用一定比例的黑白点
  • HTTP请求报文与响应报文

    一 HTTP的请求报文格式 xff1a HTTP的请求报文内容包括 xff1a 请求行 request line 请求头部 header 空行 和 请求数据 request data 四个部分组成 请求行主要包括 xff1a 请求方法 UR
  • c++中char转换为string类型

    写程序遇到一个Bug如下 xff1a char x 61 39 a 39 string str x 这里报错了 当时就有点蒙了 xff0c 查了下string的构造函数 xff1a string string const string am
  • C语言——内存管理问题

    常见的内存错误及解决方法 一 结构体成员指针未初始化 eg span class token macro property span class token directive hash span span class token dire