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(10000);
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(2*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(1,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语言动态存储分配,布布扣,bubuko.com

时间: 2024-12-31 03:23:14

C语言动态存储分配的相关文章

C/C++ 动态存储分配

C语言的动态分配函数: malloc(m):开辟m字节长度的地址空间,并返回这段空间的首地址 sizeof(x):计算变量x的长度 free(p):释放指针p所指变量的存储空间,即彻底删除一个变量 C++的动态存储分配: new  类型名T(初值列表) 功能:申请用于存放T类型对象的内存空间,并依初值列表赋以初值 结果值: 成功:T类型的指针,指向新分配的内存 失败:0(NULL) delete 指针P 功能:释放指针P所指向的内存.P必须是new操作的返回值

串的动态存储分配

串:由零个或者多个字符组成的有限序列.零个字符的串称为空串,和空格串[一个或多个空格诸城的串]有区别,请注意比较.在串的抽象数据类型中,有五个操作组成最小操作子集,分别是串赋值StrAssign,串比较StrCompare,求串长StrLength ,串联接Concat,求子串SubString.现以串的动态存储结构为例,将5个基本操作实现如下: 具体介绍详见注释. 1 /** 2 在串的抽象数据类型的13中操作中:串赋值StrAssign,串比较StrCompare,求串长StrLength

指针和动态存储分配

1 指针 指针是C语言的基本概念,每种数据类型都有相应的指针类型.指针类型变量存放的值实际上就是内存地址.指针的最基本操作: & 取地址 * 去引用(间接引用) 如: int i, *pi              //其中 i 是整型变量,pi 是指向整数的指针. pi = &i ;             //则 &i 返回i的地址并把它赋值给 pi ,若要给 i 赋值,可以写成 i = 10 ; 或者 *pi = 10 ; pi 之前的 * 是去引用 , 10 并未存放指针里

实现一个动态存储分配

如何自己实现一个动态存储的分配机制,当然有很多的存储的分配方法,关键在于"堆"的管理. 这里我们使用"隐式链表"的方法实现对"堆"的分配. 而且分配的单位是"字",这里的字是4个字节,而且我们分配的内存都按8字节(也就是双字)对齐. 上图中一个空格代表一个字(4字节) 也就是我们的堆开始三个字是堆的对齐和头部用的.最后是堆的尾. 上图是我们堆的"分配块"的头部,由于我们的堆是以8字节对齐的,也就是分配的最小

C语言动态内存分配

1.new操作符和malloc函数 C++中的new操作符会隐式的考虑到分配的数据类型(与delete配合使用),表达式实例(以int类型为例) new int[4] malloc函数向系统申请一块指定大小的连续内存块(与free配合使用),需要一个参数来指定分配空间的字节大小,函数原型为 void* malloc(unsigned size) 表达式实例 malloc(4*sizeof(int)) malloc函数在内存的堆区中查找符合要求的内存块,若成功则做好标记表示已分配并返回指向该内存块

Java中数据存储分配

(1)内存分配的策略 按照编译原理的观点,程序运行时的内存分配有三种策略,分别是静态的,栈式的,和堆式的. 静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需求,因而在编 译时就可以给他们分配固定的内存空间.这种分配策略要求程序代码中不允许有可变数据结构(比如可变数组)的存在,也不允许有嵌套或者递归的结构出现,因为 它们都会导致编译程序无法计算准确的存储空间需求. 栈式存储分配也可称为动态存储分配,是由一个类似于堆栈的运行栈来实现的.和静态存 储分配相反,在栈式存储方案中,程序对

【Cpp】考点·堆栈&amp;动态内存分配

动态内存分配 堆内存分配与释放 C/C++定义了四个内存区间:代码区,全局变量与静态变量区,局部变量区(栈区),动态内存区(堆区) 通常定义变量(或对象),编译器在编译时都可以根据该变量(或对象)的类型知道所需内存空间的大小,从而系统在适当的时候为他们分配确定的存储空间.这种内存分配称为静态存储分配.有些操作对象只在程序运行时才确定,这样编译时无法为他们预定存储空间,只能在程序运行时,系统根据运行时的要求进行内存分配,这种方法称为动态存储分配.所有动态存储分配都在堆区中进行. 当程序运行到需要一

C++ 动态内存分配(6种情况,好几个例子)

1.堆内存分配 : C/C++定义了4个内存区间: 代码区,全局变量与静态变量区,局部变量区即栈区,动态存储区,即堆(heap)区或自由存储区(free store). 堆的概念: 通常定义变量(或对象),编译器在编译时都可以根据该变量(或对象)的类型知道所需内存空间的大小,从而系统在适当的时候为他们分配确定的存储空间.这种内存分配称为静态存储分配: 有些操作对象只在程序运行时才能确定,这样编译时就无法为他们预定存储空间,只能在程序运行时,系统根据运行时的要求进行内存分配,这种方法称为动态存储分

c++动态内存分配 浅析

用new 运算符实现动态内存分配 P = new T; T是任意类型名,P是类型为T * 的指针. 动态分配出一片大小为 sizeof(T)字节的内存空间,并且将该 内存空间的起始地址赋值给P. P = new T[N]; T :任意类型名 P :类型为T * 的指针 N :要分配的数组元素的个数,可以是整型表达式 动态分配出一片大小为 sizeof(T)字节的内存空间,并且 将该内存空间的起始地址赋值给P. int * pn; 2.int i = 5; 3.pn = new int[i * 2