c语言 什么时候需要动态分配内存?

如题所述

我讲解一下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<string.h>
#include<stdlib.h>
#include<stdio.h>
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;
}

参考资料:http://bbs.bccn.net/thread-306555-1-1.html

温馨提示:内容为网友见解,仅供参考
第1个回答  2011-05-31
当你不确定内存空间大小的时候。。有2种办法。
1。预先定义一个足够大的空间。(这个比较浪费资源。而且随着程序的使用推广。预先定义的空间也不一定能完全满足条件)
2。动态的分配内存。可以做到准确分配空间大小。不浪费资源,而且也不会发生程序不断使用预先分配内存不足。
备注:动态分配的内存空间系统不负责自动回收,需要写代码手动释放。本回答被网友采纳
第2个回答  2011-05-31
需要用指针的时候,需要用数组又不知道要用多大的时候,创建实例化类对象的时候,所分配的指针大小不够的时候,其他时候
第3个回答  2011-06-12
不知到该分配多大的空间时。另外,堆作为缓存,可以防范很多形式代码攻击。
第4个回答  2011-05-31
楼上说的太全了

C语言中的动态内存分配的用法举例
1、malloc函数:其作用是在内存的动态存储区中分配一个长度为size的连续空间。其参数是一个无符号整形数,返回值是一个指向所分配的连续存储域的起始地址的指针。2、free函数:由于内存区域总是有限的,不能不限制地分配下去,而且一个程序要尽量节省资源,所以当所分配的内存区域不用时,就要释放它,以...

C语言问题:内存的分配方式有哪几种?
[1]从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。[2]在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的...

C语言中#include<malloc.h>有何作用?何时要用
malloc函数是一种分配长度为num_bytes字节的内存块的函数,可以向系统申请分配指定size个字节的内存空间。说通俗点就是动态内存分配,当无法知道内存具体位置的时候,想要绑定真正的内存空间,就需要用到动态的分配内存。malloc 函数返回的是 void * 类型。void* 表示未确定类型的指针。C,C++规定,void* ...

c语言内存有几种分配方式?
基本上C程序的元素存储在内存的时候有3种分配策略:静态分配 如果一个变量声明为全局变量或者是函数的静态变量,这个变量的存储将使用静态分配方式。静态分配的内存一般会被编译器放在数据段或代码段来存储,具体取决于实现。这样做的前提是,在编译时就必须确定变量的大小。 以IA32的x86平台及gcc编译器为...

c语言什么时候向系统要内存空间?怎么表示?
有几种情况 1、程序即将开始,预编译阶段,发现有全局或静态变量的时候。2、进入函数,并且定义一个局部变量的时候。3、程序员动态申请内存的时候。4、容器类型自增长的时候。大概就这几个情况。需要程序员关心的只有自己动态申请内存,需要手动释放 ...

动态内存分配详解——C语言
动态内存分配是C语言中处理内存空间的关键,它解决了固定空间浪费或不足的问题。动态内存管理旨在提供灵活的内存分配和释放,以适应程序运行时的需求。主要的动态内存管理函数有malloc()和free()。malloc()用于动态申请内存,其原型在stdlib.h头文件中。free()用于释放先前动态申请的内存,如果不主动释放,...

C语言中什么时候需要malloc?
C语言中malloc是动态内存分配函数。函数原型:void *malloc(unsigned int num_bytes);参数:num_bytes 是无符号整型,用于表示分配的字节数。返回值:如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回空指针NULL。void* 表示未确定类型的指针,void *可以指向任何类型的数据,...

C语言里,什么时候用数组什么时候用指针和动态内存(malloc\/calloc)?
如果明确知道所需内存的大小,可以用数组.数组大小确实有限制.因为局部数组是分配在栈上的,而栈大小是有限制的,如果超过限制,就会出现栈溢出.如果不能明确知道所需内存的大小,编程中这种情况非常常见.这个时候只能用动态内存.但是用动态内存容易出bug,主要是忘记忘记释放内存(内存溢出)和野指针(指针指向的...

C语言动态和静态存储类别的区别
静态存储就是在程序开始的时候就分配固定的内存单元,整个程序结束后释放存储单元,而动态存储单元在程序运行初不分配内存单元在用到时才分配,而当用过后则立刻释放该内存空间

C语言(六):动态内存管理
动态内存管理在C语言中扮演着关键角色,它允许程序在运行时动态地分配和释放内存空间,以适应程序的动态需求。这是通过使用一系列标准库函数来实现的,这些函数位于stdlib.h头文件中。以下是这些关键函数的简要介绍:首先,我们有malloc()函数。它允许用户请求分配一定大小的内存空间。例如,为了声明一个整型...

相似回答