您的位置:首页 > 编程语言 > C语言/C++

【C语言复习(二十)】动态内存分配

2014-06-20 10:57 246 查看

1、为什么要使用动态内存分配?

C语言中的一切操作都基于内存;

变量和数组都是内存的别名,如何分配这些内存由编译器在编译期间决定:

定义数组的时候必须指定数组长度;

数组长度在编译期就必须决定;

由于以上的限制,如果在程序运行时,一旦预先定义的数组大小不够使用,那就需要重新分配内存大小,这就要使用动态内存分配。

2、C语言内存管理函数



3、malloc和calloc函数

malloc函数分配连续的内存区域,大小不小于size字节,但其内存单元中的内容尚未定义;
calloc函数分配不少于count*size的内存空间,且会把这段内存中每个字节都初始化为0;
它们都返回void指针,返回的指针值是“分配的内存区域中”第一个字节的地址,如果无法分配内存,则会返回空指针;
把void指针赋值给不同类型的指针变量时,编译器会隐式类型转换;当存取分配的内存空间时,所使用的指针类型决定如何“翻译”该位置的数据;

4、realloc和free函数

free函数释放动态分配的内存区域,开始地址是ptr,ptr的值可以是空指针,调用此函数传入空指针时,函数不起任何作用;
realloc函数释放ptr所指的内存区域,并分配一个大小为size字节的内存区域,返回此区域的起始地址,新的内存区域可以和旧内存区域一样,起始于相同位置;
realloc函数会保留原始内存内容(只保留两者中比较小的空间大小),如果新的内存区域没有从原始区域的地址开始,那么realloc函数会将原始的内容复制到新的内存区域中,如果新的内存区域比较大,那么多出来的部分的值是没有定义的;
可以把空指针当作ptr传入realloc函数,这样realloc函数等价于malloc函数;
如果内存不足以满足新的内存分配请求,那么realloc函数返回一个空指针,这种情况下,不会释放原始内存区域,也不会改变它的内容;
传入free和realloc的指针自变量(如果不是空指针的话)必须是尚未被释放的动态分配内存区域的起始地址,如果是别的值,或者是已经释放过的内存地址,程序的行为是没有定义的,linux下可能会发生段错误,Windows下可能死掉也可能正常。
这些内存管理函数会在内部做记录,追踪每个分配内存区域大小,这就是为什么free和realloc函数的尝试都只需要地址,不需要区域大小的缘故,我们无法得知调用free函数是否成功,因为此函数没有返回值。

5、使用举例

#include <stdio.h>
#include <malloc.h>

int main()
{
int i = 0;
int* pI = (int*)malloc(5 * sizeof(int));
short* pS = (short*)calloc(5, sizeof(short));

for(i=0; i<5; i++)
{
printf("pI[%d] = %d, pS[%d] = %d\n", i, pI[i], i, pS[i]);
}

pI = (int*)realloc(pI, 10 * sizeof(int));

for(i=0; i<10; i++)
{
printf("pI[%d] = %d\n", i, pI[i]);
}

free(pI);
free(pS);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: