C语言动态存储分配
动态存储分配
C语言支持动态存储分配,即在程序执行期间分配内存单元的能力,利用动态存储分配,可以根据需要设计扩大(或缩小)的数据结构,虽然可以适用于所有类型的数据,但是动态存储分配更常用于字符串、数组和结构体
本文地址:http://www.cnblogs.com/archimedes/p/c-dynamic-storage-allocation.html,转载请注明源地址。
1、内存分配函数
3种内存分配函数都是声明在<stdlib.h>中:
- malloc函数--分配内存块,但是不对内存块进行初始化
- calloc函数--分配内存块,并且对内存块进行消除
- realloc函数--调整先前分配的内存块
malloc函数不需要对分配的内存快进行清除,所以它比calloc函数更高效
当申请内存块而调用内存分配函数的时候,函数会返回void*型的值。内存中对象的空间大小,是以“字节”的数目为单位计算的,许多头文件都定义了size_t类型,专门用来保存这种“内存”空间的相关信息,比如sizeof运算符返回字节的数目,类型是size_t
2、空指针
由于用名NULL的宏来表示空指针,所以常使用下列方式测试malloc函数的返回值:
p=malloc();
if(p==NULL) {
/*分配失败*/
}
在C语言中,指针测试真假的方法和数的测试一样:
if(p==NULL)
if(!p)
if(p!=NULL)
if(p)
举例如下:
typedef struct {
long key;
/*...*/
}Record;
float *myFunc(size_t n)
{
double *dptr=malloc(sizeof(double));
if(dptr==NULL)
{
/*...*/
return NULL:
}
else
{
*dptr=0.07;
}
/*...*/
Record *rptr;
if(rptr=malloc(*sizeof(Record))==NULL)
{
/*...*/
return NULL;
}
float *fptr=malloc(n*sizeof(float));
if(fptr==NULL)
{
/*...*/
return NULL:
}
/*...*/
return fptr;
}
动态分配数组
使用malloc函数为数组分配存储空间,需要使用sizeof运算符来计算每个元素所需要的空间数量
int *a;
a=malloc(n * sizeof(int));
calloc函数
calloc函数在<stdlib.h>中具有如下的原型:
void *calloc(size_t nmemb, size_t size);
在分配了内存之后,calloc函数会通过对所有位设置为0的方式进行初始化
a=calloc(n, sizeof(int))
struct point{int x,y;}*p;
p=calloc(,sizeof(struct point));
realloc函数
realloc函数可以调整数组的大小使它更适合需要,realloc函数原型在<stdlib.h>中:
void *realloc(void *ptr, size_t size)
ptr指向的内存块一定是先前通过malloc函数、calloc函数或realloc函数的调用获得的,size表示内存块的新尺寸
C语言标准列出几条关于realloc函数的规则:
- 当扩展内存块时,realloc函数不会对添加进内存块的自己进行初始化
- 如果realloc函数不能按照要求扩大内存块,那么它会返回空指针,并且在原有的内存块中的数据不会发生改变
- 如果realloc函数调用时以空指针作为第一个实际参数,那么它的行为就像malloc函数一样
- 如果realloc函数调用时以0作为第二个实际参数,那么它会释放掉内存块
释放存储
内存分配函数所获得的内存块都来自一个称为堆的存储池
p=malloc(...)
q=malloc(...)
p=q;
上面的代码使得p和q都指向同一块内存,导致出现内存泄露,使用free函数来释放不需要的内存,来回收垃圾
free函数在<stdlib.h>中有如下原型:
void free(void *ptr)
以上的代码改写如下:
p=malloc(...)
q=malloc(...)
free(p);
p=q;
C语言动态存储分配的更多相关文章
- C/C++ 动态存储分配
C语言的动态分配函数: malloc(m):开辟m字节长度的地址空间,并返回这段空间的首地址 sizeof(x):计算变量x的长度 free(p):释放指针p所指变量的存储空间,即彻底删除一个变量 C ...
- 全国计算机等级考试二级教程-C语言程序设计_第13章_编译预处理和动态存储分配
free(p);//释放内存 p = NULL;//软件工程规范,释放内存以后,指针应该赋值为空 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h ...
- C语言动态内存分配
考虑下面三段代码: 片段1 void GetMemory(char *p) { p = (); } void Test(void) { char *str = NULL; GetMemory(str) ...
- C语言中动态内存分配的本质是什么?
摘要:C语言中比较重要的就是指针,它可以用来链表操作,谈到链表,很多时候为此分配内存采用动态分配而不是静态分配. 本文分享自华为云社区<[云驻共创]C语言中动态内存分配的本质>,作者: G ...
- C++语言之动态内存分配
在C语言中,我们熟悉的内存分配与释放的最常用的接口分别是malloc , free .在C++中: 存在着更加方便的动态存储分配: 1.new 和delete 机制,new 它能更可靠控制存储区的分配 ...
- Java中数据存储分配
(1)内存分配的策略 按照编译原理的观点,程序运行时的内存分配有三种策略,分别是静态的,栈式的,和堆式的. 静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需求,因而在编 译时就可以给 ...
- C++动态内存分配
C++动态内存分配1.堆内存分配 :C/C++定义了4个内存区间:代码区,全局变量与静态变量区,局部变量区即栈区,动态存储区,即堆(heap)区或自由存储区(free store). 堆的概念:通常定 ...
- C++ 动态内存分配(6种情况,好几个例子)
1.堆内存分配 : C/C++定义了4个内存区间: 代码区,全局变量与静态变量区,局部变量区即栈区,动态存储区,即堆(heap)区或自由存储区(free store). 堆的概念: 通常定义变量(或对 ...
- [UE4]C++ 动态内存分配(6种情况,好几个例子)
1.堆内存分配 : C/C++定义了4个内存区间: 代码区,全局变量与静态变量区,局部变量区即栈区,动态存储区,即堆(heap)区或自由存储区(free store). 堆的概念: 通常定义变量(或对 ...
随机推荐
- 新浪微博OAuth2.0的用法
最近学习Android开发,照着视频开发新浪微博,但是视频里的介绍的是OAuth1.0的授权方式,试了半天发现用不了. 原来现在一般没审核的用户只能使用OAuth2.0了,视频教学里的方法已经过时了. ...
- 浏览器 Pointer Events
前言 Pointer Events是一套触控输入处理规格,支持Pointer Events的浏览器包括了IE和Firefox,最近Chrome也宣布即将支持该处理规则. PointerEvent Po ...
- Node.js建站笔记-使用react和react-router取代Backbone
斟酌之后,决定在<嗨猫>项目中引入react,整体项目偏重spa模式,舍弃部分server端的模板渲染,将一部分渲染工作交给前端react实现. react拥有丰富的组件,虽然不如Back ...
- LeetCode——Jump Game II
Description: Given an array of non-negative integers, you are initially positioned at the first inde ...
- [linux]记录如何设置一个新的vps
背景 我正在做一个小项目,做好了打算上线,所有需要买个服务器,看了一圈,发现还是卖个vps合算.买了之后,进行了一些列的设置,这里记录一下,以便后面查看. 系统: ubuntu 内存:1G 一.更改时 ...
- [python]初探socket
1.什么是socket? Socket中文译作:套接字,但是大家一般约定俗称的都用:socket.我想在解释socket是什么之前,先说它是用来干嘛的:socket是来建立'通信'的基础,建立连接,传 ...
- MySQL中的账号与权限管理
MySQL权限管理 权限系统的工作原理 MySQL权限系统通过下面两个阶段进行认证: (1)对连接的用户进行身份认证,合法的用户通过认证.不合法的用户拒绝连接. (2)对通过认 ...
- sprint 1 总结
1.之前已经总结了一下了.. 提前完成了任务,明天还要继续测试一下,看有没有BUG.这次搭建,遇到好多问题,服务器经常不稳定崩毁,毕竟免费...不能完美..途中经常小细节没注意,导致错误连连,卡了好几 ...
- RequireJS 模块化加载框架使用
RequireJS 是一个遵循 AMD 规范的模块化加载框架 与上文seajs一样,这里简单介绍其相关用法 同样的,首先是下载好 require.js --> http://requirejs. ...
- DBSet Class(EF基础系列11)
Method Name Return Type Description Add Added entity type Adds the given entity to the cont ...