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()的一个问题——堆越界的一个错误。相关推荐

  1. c语言注释两种,C语言有几种注释方式

    C语言有两种注释方式,一种是以/*开始,以*/结束的块注释:另一种是以//开始,以换行符结束的单行注释.具体使用方法如:[const double pi = 3.1415926536; // pi是- ...

  2. linux 在指定区域分配内存 c语言,C语言动态内存分配:(一)malloc/free的实现及malloc实际分配/释放的内存...

    一.malloc/free概述 malloc是在C语言中用于在程序运行时在堆中进行动态内存分配的库函数.free是进行内存释放的库函数. 1.函数原型 #include void *malloc( s ...

  3. C语言动态内存分配:(一)malloc/free的实现及malloc实际分配/释放的内存

    最新个人博客 shankusu.me 以下内容转载或参考或引用自 https://blog.csdn.net/zxx910509/article/details/62881131 一.malloc/f ...

  4. c语言malloc函数程序,c语言 malloc函数详解

    谈到malloc函数相信学过c语言的人都很熟悉,但是malloc底层到底做了什么又有多少人知道. 1.关于malloc相关的几个函数 关于malloc我们进入Linux man一下就会得到如下结果: ...

  5. c语言malloc作用,c语言中malloc是什么?怎么用?

    c语言中malloc是什么?怎么用? malloc() 函数用来动态地分配内存空间,其原型为:void* malloc (size_t size); 说明: [参数说明] size 为需要分配的内存空 ...

  6. C语言学习18:指针6—malloc的用法

    /*malloc 是 memory(内存) allocate(分配)的缩写*/# include <stdio.h> # include <malloc.h> //不能省int ...

  7. 取两个数较小值c语言_如何提升C语言安全性,达到RUST的安全性

    可信C语言:让C语言达到和RUST一样的安全性 1. 所有权 所有运行的程序都必须管理其使用计算机内存的方式.一些语言中具有GC(Garbage Collection)机制,在程序运行时不断地寻找不再 ...

  8. c语言实现两个有序链表的合并(代码示例)

    c语言实现两个有序链表的合并: 现有两个有序单链表,通过代码实现将两个单链表合并为一个有序的新表,要求使用旧表的空间,不能新分配内存 #include #include typedef struct ...

  9. C语言无符号双字节乘法,华为OJ机试标题:两个大整数相乘(纯C语言实现两个大整数相乘,两种方法实现大数相乘)...

    华为OJ机试题目:两个大整数相乘(纯C语言实现两个大整数相乘,两种方法实现大数相乘) 题目描述: 输出两个不超过100位的大整数的乘积. 输入: 输入两个大整数,如1234567 123 输出: 输出 ...

最新文章

  1. python3 入门 (四) 类与继承
  2. 《算法设计编程实验:大学程序设计课程与竞赛训练教材》——2.3 构造法模拟的实验范例...
  3. VTK:在多面体数据上使用裁剪和封盖用法实战
  4. Pixhawk之姿态解算篇(2)_mahony算法分析
  5. android 读取manifest的数据
  6. AJPFX关于构造器的总结
  7. echart移上去显示内容_echarts如何移动到柱状图上显示自己想显示的提示信息
  8. Java14:使用Java 14的新记录联接数据库表
  9. 【java学习之路】(java SE篇)008.集合
  10. 学python能做什么类型的工作-做自动化,学python要到那种程度呢?
  11. 2015.11.18——Lua中文教程
  12. 回溯法——素数环C++实现
  13. 完整版通达OA2015-2017版本1day漏洞利用
  14. Html页面点击下载文件
  15. IP is locked 的解决办法 Vivado
  16. 百度网盘/U盘,上传文件时提示超过4G限制如何解决
  17. top n with ties
  18. 蘑菇街Android组件与插件化
  19. 我的小程序新增了证件照换底色功能
  20. 网易云课堂[Web安全工程师]第一部分 第二章WEB简介 学习记录

热门文章

  1. 关于outlook无法打开,提示无法启动Microsoft Outlook。无法打开此文件集合。到 Microsoft Exchange的登录失败
  2. 计算机丢失UxTheme无法修复,RWUXThemeSU90.dll
  3. 多普达系列 内存不足如何处理
  4. B - Balala Power!
  5. source insight代码自动对齐
  6. 【JavaGUI demo】swing仿Windows气泡屏保动画(含源码)
  7. 金山打字通2011+免升级
  8. Python+Opencv:在视频上叠加一个背景透明Logo
  9. Simulink自动代码生成2——生成嵌入式代码(generating embedded code)
  10. 解决IE被www.633dh.com/劫持