我讲解一下c语言中动态分配内存的函数 (2)

我讲解一下c语言中动态分配内存的函数 (2)
我讲解一下c语言中动态分配内存的函数 (2)

我讲解一下c语言中动态分配内存的函数,可能有些初学c语言的

人不免要问了:我们为什么要通过函数来实现动态分配内存呢?系统难道不是会自动分配内存吗??

既然有人会问这样的问题,那么我在这里好好的讲解一下吧!

首先让我们熟悉一下计算机的内存吧!在计算机的系统中有四个内存区域:1)栈:在栈里面储存一些我们定义的局部变量以及形参(形式参数);2)字符常量区:主要是储存一些字符常量,比如:char *p_str=”cgat”;其中”cgat”就储存在字符常量区里面;3)全局区:在全局区里储存一些全局变量和静态变量;4)堆:堆主要是通过动态分配的储存空间,也就是我们接下需要讲的动态分配内存空间。

什么时候我们需要动态分配内存空间呢?举一个例子吧。int *p;我们定义了一个指向int类型的指针p;p是用来储存一个地址的值的,我们之所以要为p

这个变量分配空间是让它有一个明确的指向,打个比方吧!你现在做好了一个指向方向的路标,但是你并没有让这个路标指向一个确切的方位,也就是说现在的这个路标是瞎指向的,这样我们就不能够通过它来明确到底哪里是东,哪里是西,何为北,何为南了。虽然我们在计算机的内存里定义了一个指针变量,但是我们并没有让这个变量指示一个确切int类型变量的地址,所以我们就必须要让它有一个明确的指示方向。这样我们就要通过动态分配内存的方式来认为的规定它的方向!

我们在刚刚接触指针的时候遇到过这样的情况,int *p;p=&a;这种方法不是指针的动态分配内存,这个叫做指针变量的初始化!初始化同样也可以让指针变量有方向可指。

int *p;p=malloc(n*sizeof(类型名称));我们通过malloc()函数为一个指针变量p分配了地址,这样我们从键盘上键入的值就这样存储在p里面了,接下来我们就可以对这个p进行具体的操作了,比如scanf(“%s”,p)等等。当我们对p结束操作的时候还要释放p的内存空间。为什么要释放内存空间呢?在上面我已经讲过动态分配的变量时储存在堆里面,但是这个堆的空间并不是无限大的,也许当我们编一个小的程序的时候可能我们并不能够发现什么,但是对于那些大的程序,如果我们比及时释放堆的空间的时候会放生内存泄露。所谓内存泄露是因为堆的空间北我们动态分配用完了,这样当我们再去使用动态分配堆的空间的时候就没有足够的空间让我们使用了,这样就需要占有原来的空间,也就是会把其他的空间来储存我们键入的值,这样会导致原来储存的数据被破坏掉,导致了内存的泄露了。

同时当我们使用malloc()函数的时候还应该注意当我们释放完空间的时候还要将原先的指针变量赋予一个NULL,也就是赋予一个空指针,留着下次的时候使用它!如果我们不赋予|NULL行不行呢??答案是:不行的!如果我们不赋予一个空指针这样会导致原先的指针变量成为了一个野指针!何谓野指针?野指针就是一个没有明确指向的指针,系统不知道它会指向什么地方,野指针是很危险的,因此当我们每次使用完malloc()函数的时候都必须将指针赋予一个空指针!相对于malloc()函数,calloc()函数就不需要我们赋予NULL了,这是因为在每次调用完calloc()函数的时候系统会自动将原先的指针赋予一个空指

针,即归于“0”。calloc()函数的原型是void *calloc(count,sizeof(类型名称));比如:p=(char*)calloc(4,sizeof(char));我们为p分配了指向char型指针的“4”个空间。

除了malloc()与calloc(),还有一个动态分配空间的函数realloc()函数,这个函数比前两个函数分配更多的空间,原型:void *realloc(void *p,size_t size);

该函数有几个作用:

1)如果有足够的空间来扩充p的内存块,则返回一个指向p的指针;

2)如果没有足够的空间来扩充p的内存块,则为p从新分配size的空间,并把原来的内容复制给p,指向p的开头,同时释放原来的空间,返回一个指向新内存块的指针;

3)如果p=NULL,其作用于malloc()相似;

下面举一个程序的例子:

#define LONG 10

#include

#include

#include

main()

{

char *message,buf[LONG];

gets(buf);

message=(char*)realloc(NULL,strlen(buf)+1);

strcpy(message,buf);

puts(message);

gets(buf);

message=(char*)realloc(message,(strlen(message)+strlen(buf)+1));

strcat(message,buf);

puts(message);

return 0;

}

动态分配内存

目录

基本信息

详细释义

编辑本段基本信息

所谓动态内存分配(Dynamic Memory Allocation)就是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法。动态内存分配不

象数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据

程序的需要即时分配,且分配的大小就是程序要求的大小。

编辑本段详细释义

例如我们定义一个float型数组:float score[100];

但是,在使用数组的时候,总有一个问题困扰着我们:数组应该有多大?在很多的情况下,你并不能确定要使用多大的数组,比如上例,你可

能并不知道我们要定义的这个数组到底有多大,那么你就要把数组定义得

足够大。这样,你的程序在运行时就申请了固定大小的你认为足够大的内

存空间。即使你知道你想利用的空间大小,但是如果因为某种特殊原因空

间利用的大小有增加或者减少,你又必须重新去修改程序,扩大数组的存

储范围。这种分配固定大小的内存分配方法称之为静态内存分配。但是这

种内存分配的方法存在比较严重的缺陷,特别是处理某些问题时:在大多

数情况下会浪费大量的内存空间,在少数情况下,当你定义的数组不够大时,可能引起下标越界错误,甚至导致严重后果。

我们用动态内存分配就可以解决上面的问题. 所谓动态内存分配就是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法。

动态内存分配不象数组等静态内存分配方法那样需要预先分配存储空间,

而是由系统根据程序的需要即时分配,且分配的大小就是程序要求的大小。

从以上动、静态内存分配比较可以知道动态内存分配相对于静态内存

分配的特点:

1、不需要预先分配存储空间;

2、分配的空间可以根据程序的需要扩大或缩小。

要实现根据程序的需要动态分配存储空间,就必须用到malloc函数.

malloc函数的原型为:void *malloc (unsigned int size) 其作用是在内存的动态存储区中分配一个长度为size的连续空间。其参数是一个无符号整形数,返回值是一个指向所分配的连续存储域的起始地址的指针。

还有一点必须注意的是,当函数未能成功分配存储空间(如内存不足)就

会返回一个NULL指针。所以在调用该函数时应该检测返回值是否为NULL 并执行相应的操作。

相关主题
相关文档
最新文档