动态内存开辟
来源:互联网 发布:中国大学生网络党课 编辑:程序博客网 时间:2024/05/29 06:56
动态内存开辟(malloc(),calloc(),free(),relloc())
首先,简单讲述静态内存开辟,对于书写一个c语言程序来说,第一步要做的就是开辟内存空间,其形式为:类型+空间名。例如:int age; Char name; double average ; 这样开辟的空间用来存放待处理的内容,该空间又称为变量,其中存放的内容可以被改变,即可多次被赋予内容,但是,在下一次存入内容的时候,原来的数据将不复存在,变量一旦开辟,便在内存中占一定大小,在非主函数中,该变量随着函数调用开始而开辟,一旦子函数结束,空间自动销毁,待下一次函数调用时,再重新开辟空间,那么,能不能找到一种方法,使得开辟的空间在需要的时候被开辟,用户不用时再销毁释放呢?
这里,我们引入动态内存开辟的概念。动态内存分配是指在程序执行的过程中,动态的分配或收回存储空间的方法,其不像数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据程序的需要即时分配,且分配的大小就是程序要求的大小。
malloc():译为存储器分配。malloc()是C语言中动态存储管理的一组标准库函数之一,其作用是在内存的动态存储区中分配一个长度为size的连续空间,其参数是一个无符号的整形数,返回值是一个指向所分配的连续储存域的起始地址的指针。另外,当函数未能成功分配存储空间时,返回NULL(空指针)。
故而,当在调用函数时,必须先判断是否为空指针(NULL),可用assert 断言,寒暑形式为:void * malloc(sizeof +类型),这里void*为任何指针类型,sizeof为求字节,例如: int p =(int )malloc(40);值得注意的是,在使用malloc ()开辟的内存块,内存大小是确定的,同样不允许越界访问:
给个梨子:
int main ()
{
int p=(int )malloc(40);
if(p==NULL)
{
printf(“out of memory\n”);
Exit(EXIT_FAILURE);
}
for(i=0;i<10;i++)
*(p+i)=10-i;
free(p);
P=NULL;
Return 0;
}
Calloc:函数使用形式int ptr=(int )calloc(10,sizeof(int));
举个栗子:将数组元素初始化为0;
int main()
{
int ptr=(int )calloc(10,sizeof(int));
if(ptr==NULL)
{ printf(“out of memeory\n”);
exit(EXIT_FRILURE);
}
free(ptr);
ptr=NULL;
return 0
}
下面,对于malloc函数,有以下几点需要十分注意:
1,malloc 函数与free配对使用
2,不能对动态开辟的空间越界访问
3,不能对NULL指针进行解引用操作
4,不能对已释放的内存再次使用
5,对动态开辟空间多次释放
6,不能对动态开辟空间的一部分释放
对于动态内存开辟,大概就浅谈到此吧,希望大家多多指教哦,发现问题并提出问题有奖励哦
- 动态开辟内存总结
- 动态内存开辟
- 动态内存开辟
- 动态内存开辟
- c++动态内存开辟
- 动态内存开辟
- c语言动态开辟内存
- 二维数组动态开辟内存
- c语言动态开辟内存
- C++动态内存的开辟
- 双重指针动态开辟内存
- 动态内存开辟(c)
- c语言动态内存开辟
- 通讯录动态版(动态内存开辟)
- 数组内存的动态开辟和释放
- 链地址法+动态开辟内存 hash
- 顺序表(动态开辟内存)
- C++基础:动态内存开辟new_delete
- SQL主鍵:日期+序列
- Java多线程--Exchanger(一)
- 使用SSM框架整合时,无法创建XXXXBean
- Asp.Net MVC 5使用Identity之简单的注册和登陆
- 小白的踩坑记录——socket.io-解决多进程
- 动态内存开辟
- spring-Scheduled
- 对称的二叉树
- Java多线程--Exchanger(二)
- Oracle之JAVA数据导出工具-yellowcong
- 欢迎使用CSDN-markdown编辑器
- CentOS 中 nginx 负载均衡和反向代理的搭建 阅读 2449
- 高逼格Mac应用程序、软件分享【主要面向开发者和设计师】
- vb在串口通信中运行时错误‘380’无效属性值