使用malloc和free函数进行内存动态分配
一、在学习c语言里面,内存分配这个话题非常有意思,因为我们平时在开发的时候,如果一不小心没注意内存释放的话,写的的程序很容易出错,所以今天就来回顾一下c语言里面的内存动态分配,下面我们先来看一个实例来进行分析
#include <stdio.h>
#include <malloc.h>
int main(void)
{
int a[] = {, , , , };
int len;
printf("请输入数组的长度大小:len= ");
scanf("%d",&len);
int * pArr = (int *)malloc(sizeof(int) * len);
*pArr =;
pArr[] =;a
printf("%d %d\n", *pArr, pArr[]);
free(pArr); return ;
}
程序代码说明:
1、(int *)malloc(sizeof(int) * len)这句话的意思是:
a、这里使用了函数sizeof返回数据类型为int 的数组字节个数,同时这里要注意我们这里写的malloc函数只有一个形参,表示要求系统分配的字节数
b、malloc函数的功能是请求系统sizeof(int) * len个字节的内存空间,如果请求分配成功的话,则返回第一个字节的地址,如果分配不成功的话,则返回NULL。
c、malloc函数能且只能返回第一个字节的地址,所以我们需要把这个无实际意义的第一个字节的地址(俗称干地址)转化为有实际意义的地址,所以malloc函数前面必须加(数据类型 *),表示把这个无实际意义的地址转为相应数据类型的地址。
d、所以这里这句话的意思是把系统分配好的20个字节的第一个字节的地址转为四个字节,这样p就指向了第一个的四个字节,pArr+1就指向了第2个的四个字节,pArr+i就指向了第i+1个的四个字节。pArr[0]就是第一个元素,pArr[i]就是i+1个元素
2、通过上面的分析,上面的代码*pArr=4(也可以写成a[0]=4),pArr[1]=10(也可以写成a[1]=10),同时在分配了20个字节的系统内存后,使用了free()函数进行了释放内存,这样就不会造成系统内存的浪费
3、最终结果为:

二、接下来我使用for循环来访问数组,代码如下:
#include <stdio.h>
#include <malloc.h>
int main(void)
{
int a[] = {, , , , };
int len;
int i=;
printf("请输入数组的大小:len= ");
scanf("%d",&len);
int * pArr = (int *)malloc(sizeof(int) * len);
for( i=; i<len;++i)
{
scanf("%d",&pArr[i]);
}
for(i=;i<len;++i)
{
printf("%d\n",*(pArr+i));
}
free(pArr); return ;
}
运行结果如下:

三、跨函数使用内存例子:
#include <stdio.h>
#include <malloc.h>
struct student
{
int sid;
int age;
};
struct student * creatstudent(void);
void showstudent(struct student *);
int main(void)
{
struct student *ps ;
ps=creatstudent();
showstudent(ps); free(ps);
return ;
}
void showstudent(struct student *pst)
{
printf("%d %d\n",pst->sid, pst->age);
}
struct student * creatstudent(void)
{
struct student * p =(struct student *)malloc(sizeof(struct student));
p->sid=;
p->age=;
return p;
}
运行效果如下:

程序说明:
这里我们通过建立函数来分配内存单元,来达到内存灵活分配使用。
使用malloc和free函数进行内存动态分配的更多相关文章
- [C语言] 数据结构-预备知识跨函数使用内存
跨函数使用内存 一个函数运行结束,使用malloc函数分配的内存,如果不调用free,就不会释放 在另一个函数中还可以继续使用 #include <stdio.h> #include &l ...
- malloc函数分配内存失败的常见原因
malloc()函数分配内存失败的常见原因: 1. 内存不足. 2. 在前面的程序中出现了内存的越界访问,导致malloc()分配函数所涉及的一些信息被破坏.下次再使用malloc()函数申请内存 ...
- 数据结构笔记2(c++)_跨函数使用内存的问题
预备知识 1.所有的指针变量只占4个子节 用第一个字节的地址表示整个变量的地址 //1.cpp 所有的指针变量只占4个子节 用第一个字节的地址表示整个变量的地址 # include <stdi ...
- malloc 与 free函数详解<转载>
malloc和free函数详解 本文介绍malloc和free函数的内容. 在C中,对内存的管理是相当重要.下面开始介绍这两个函数: 一.malloc()和free()的基本概念以及基本用法: 1 ...
- DLL函数中内存分配及释放的问题
DLL函数中内存分配及释放的问题 最近一直在写DLL,遇到了一些比较难缠的问题,不过目前基本都解决了.主要是一些内存分配引起问题,既有大家经常遇到的现象也有特殊的 情况,这里总结一下,做为资料. 错误 ...
- ZH奶酪:C语言中malloc()和free()函数解析
1.malloc()和free()的基本介绍 (1)函数原型及说明 void *malloc(long NumBytes) 该函数分配了NumBytes个字节,并返回了指向这块内存的指针.如果分配失败 ...
- malloc与free函数用法
在C里,内存管理是通过专门的函数来实现.另外,为了兼容各种编程语言,操作系统提供的接口通常是 C 语言写成的函数声明 (Windows 本身也由C和汇编语言写成). 1 分配内存 malloc 函数 ...
- uC/OS-II 函数之内存管理相关函数
上文主要介绍了邮箱管理相关的函数,本文介绍内存管理相关的函数:OSMemCreate()内存块创建函数,OSMemGet()函数,OSMemPut()函数,OSMemQuery()函数.以前用过的uC ...
- 范围for、new内存动态分配、nullptr
一.范围for语句:用于遍历一个序列 ,,,,}; for(auto &x : v) // 省了拷贝的动作,提高了系统效率 { cout << x << endl; } ...
随机推荐
- [BJDCTF 2nd]fake google
[BJDCTF 2nd]fake google 进入页面: 试了几下发现输入xxx,一般会按的格式显示, P3's girlfirend is : xxxxx 然后猜测会不会执行代码,发现可以执行 & ...
- 接口自动化框架pyface详细介绍
版权说明 本框架系本人结合一些实践经验和开源框架设计思想,在家基于兴趣爱好独立完成的代码开发. 源码只保存在私人电脑,办公电脑上无.github开源与公司无关,先把关系撇清,不涉及侵权. 嘘. 框架定 ...
- PHP中$$的应用
PHP中$表示一个变量的声明,$value='test':表示变量value的值是test. 而$$则好像是C语言中的指针,它指向一个变量值的一个变量. 例如:$$value='a';这句话的意思就是 ...
- 报错:Error updating database. Cause: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'gender' at row 1
我遇到这个错误是解决办法:我修改了对应的数据库字段的长度:原本我设置的是char型,但是存进去的是一个string型,结果就报了这个报了这个错误 下面就是数据库修改之后的结果. 以上都是我学习过程中遇 ...
- SQL server 2012安装教程
转自:https://blog.csdn.net/u013162035/article/details/78567389 注]博主使用的是SQL Server2012 其他版本的安装类似.[第一步]下 ...
- FaceBook 发布星际争霸最大 AI 数据集
简介 我们刚发布了最大的星际争霸:Brood War 重播数据集,有 65646 个游戏.完整的数据集经过压缩之后有 365 GB,1535 million 帧,和 496 million 操作动作. ...
- RuntimeError: PyTorch was compiled without NumPy support
原因:Pytorch和Numpy版本不匹配 查看自己Pytorch和Numpy版本 (1)执行[pip show torch]和[pip show numpy]查看版本信息(可通过[pip -h]查看 ...
- Spring中的设计模式:工厂方法模式
导读 工厂方法模式是所有设计模式中比较常用的一种模式,但是真正能搞懂用好的少之又少,Spring底层大量的使用该设计模式来进行封装,以致开发者阅读源代码的时候晕头转向. 文章首发于微信公众号[码猿技术 ...
- springboot集成通用mapper详细配置
通常,我们利用mybatis写持久层方法.要么按照传统定义mapper方法,定义xml文件的方式,全部手写.要么需要通过mybatis-generator逆向工程插件生成大量的xxxExample文件 ...
- B [JLOI2012]树
时间限制 : - MS 空间限制 : - KB 评测说明 : 1s,128m 问题描述 在这个问题中,给定一个值S和一棵树.在树的每个节点有一个正整数,问有多少条路径的节点总和达到S.路径中节点 ...