C语言malloc两次,C语言malloc()的一个问题——堆越界的一个错误。
malloc函数分配得到的空间是存储在堆区的。
系统推出后是不会被释放的,必须由程序员自己用free释放。
#include
#include
#include
#include
#include
int main()
{
int address;
char *q;
char *p=(char *)malloc(sizeof(char)*10);
q=strcpy(p,"chenhuijie is a good boy");
printf("p:%s(%p),q:%s(%p)\n",p,p,q,q);
address=(int)p;
printf("int:%p",address);
printf("the string is %s\n",(char *)address);
free(p);
//p++;
}
在调试时,单步调试至free(p)时。发生如下错误。
原来是发生了堆越界了。
char *p=(char *)malloc(sizeof(char)*10);
q=strcpy(p,"chenhuijie is a good boy");
分配的堆空间为10个byte。多出来的字符被放置在10之后的内存中。一不小心发生了越界。才出现了这个堆被破坏的错误。
为了提高健壮性,应改为如下:
#include
#include
#include
#include
#include
#define m_len 30
int main()
{
int address;
char *q="chenhuijie is a good boy";
char *p=(char *)malloc(sizeof(char)*m_len);
assert((strlen(q)+1)
q=strcpy(p,q);
printf("p:%s(%p),q:%s(%p)\n",p,p,q,q);
address=(int)p;
printf("int:%p",address);
printf("the string is %s\n",(char *)address);
free(p);
//p++;
}
主要是增加了长度检查的功能。为什么
strlen(q)+1)这样呢?是因为strlen()返回的是字符串不含结尾符的字符个数。
C语言malloc两次,C语言malloc()的一个问题——堆越界的一个错误。相关推荐
- c语言注释两种,C语言有几种注释方式
C语言有两种注释方式,一种是以/*开始,以*/结束的块注释:另一种是以//开始,以换行符结束的单行注释.具体使用方法如:[const double pi = 3.1415926536; // pi是- ...
- linux 在指定区域分配内存 c语言,C语言动态内存分配:(一)malloc/free的实现及malloc实际分配/释放的内存...
一.malloc/free概述 malloc是在C语言中用于在程序运行时在堆中进行动态内存分配的库函数.free是进行内存释放的库函数. 1.函数原型 #include void *malloc( s ...
- C语言动态内存分配:(一)malloc/free的实现及malloc实际分配/释放的内存
最新个人博客 shankusu.me 以下内容转载或参考或引用自 https://blog.csdn.net/zxx910509/article/details/62881131 一.malloc/f ...
- c语言malloc函数程序,c语言 malloc函数详解
谈到malloc函数相信学过c语言的人都很熟悉,但是malloc底层到底做了什么又有多少人知道. 1.关于malloc相关的几个函数 关于malloc我们进入Linux man一下就会得到如下结果: ...
- c语言malloc作用,c语言中malloc是什么?怎么用?
c语言中malloc是什么?怎么用? malloc() 函数用来动态地分配内存空间,其原型为:void* malloc (size_t size); 说明: [参数说明] size 为需要分配的内存空 ...
- C语言学习18:指针6—malloc的用法
/*malloc 是 memory(内存) allocate(分配)的缩写*/# include <stdio.h> # include <malloc.h> //不能省int ...
- 取两个数较小值c语言_如何提升C语言安全性,达到RUST的安全性
可信C语言:让C语言达到和RUST一样的安全性 1. 所有权 所有运行的程序都必须管理其使用计算机内存的方式.一些语言中具有GC(Garbage Collection)机制,在程序运行时不断地寻找不再 ...
- c语言实现两个有序链表的合并(代码示例)
c语言实现两个有序链表的合并: 现有两个有序单链表,通过代码实现将两个单链表合并为一个有序的新表,要求使用旧表的空间,不能新分配内存 #include #include typedef struct ...
- C语言无符号双字节乘法,华为OJ机试标题:两个大整数相乘(纯C语言实现两个大整数相乘,两种方法实现大数相乘)...
华为OJ机试题目:两个大整数相乘(纯C语言实现两个大整数相乘,两种方法实现大数相乘) 题目描述: 输出两个不超过100位的大整数的乘积. 输入: 输入两个大整数,如1234567 123 输出: 输出 ...
最新文章
- python3 入门 (四) 类与继承
- 《算法设计编程实验:大学程序设计课程与竞赛训练教材》——2.3 构造法模拟的实验范例...
- VTK:在多面体数据上使用裁剪和封盖用法实战
- Pixhawk之姿态解算篇(2)_mahony算法分析
- android 读取manifest的数据
- AJPFX关于构造器的总结
- echart移上去显示内容_echarts如何移动到柱状图上显示自己想显示的提示信息
- Java14:使用Java 14的新记录联接数据库表
- 【java学习之路】(java SE篇)008.集合
- 学python能做什么类型的工作-做自动化,学python要到那种程度呢?
- 2015.11.18——Lua中文教程
- 回溯法——素数环C++实现
- 完整版通达OA2015-2017版本1day漏洞利用
- Html页面点击下载文件
- IP is locked 的解决办法 Vivado
- 百度网盘/U盘,上传文件时提示超过4G限制如何解决
- top n with ties
- 蘑菇街Android组件与插件化
- 我的小程序新增了证件照换底色功能
- 网易云课堂[Web安全工程师]第一部分 第二章WEB简介 学习记录
热门文章
- 关于outlook无法打开,提示无法启动Microsoft Outlook。无法打开此文件集合。到 Microsoft Exchange的登录失败
- 计算机丢失UxTheme无法修复,RWUXThemeSU90.dll
- 多普达系列 内存不足如何处理
- B - Balala Power!
- source insight代码自动对齐
- 【JavaGUI demo】swing仿Windows气泡屏保动画(含源码)
- 金山打字通2011+免升级
- Python+Opencv:在视频上叠加一个背景透明Logo
- Simulink自动代码生成2——生成嵌入式代码(generating embedded code)
- 解决IE被www.633dh.com/劫持