首先,我们应该知道。所有的程序都必须留出足够的内存空间来存储所使用的数据,所以我们常常会预先给程序开辟好内存空间,然后进行操作,比如我们平常使用的数组就是这样子的。数组我们在定义的时候必须给提前开辟好空间。而且在程序运行的过程中,这个开辟的内存空间是一直存在的。除非等到这个函数运行完成,系统才会将空间释放。但事实上另一个问题就是这个数组在程序中无法被改动。另一种选择,能够让内存分配自己主动进行下去。下面我就来介绍在C语言中如何动态分配内存。
内存分配实例
1.从静态区分配内存
静态区是用来存放全局初始化变量和为初始化变量,如果我们定义一个变量,系统会自动的在静态区为其分配内存空间。如:
#include"stdio.h"
//全局变量存在静态区
int a, b, c, d;
int array[10] = { 0 };
int main()
{
return 0;
}
例子中的a b c d就是在静态区分配内存空间的。
2.从栈中分配内存
栈内存在函数中定义的一些基本类型的变量和对象的引用变量(形参 地址等)都在函数的栈内存中分配。如:
#include"stdio.h"
//全局变量存在静态区
int a, b, c, d;
int array[10] = { 0 };
int main()
{
int temp = 0;
char name[20] = { "Hello Word!" };
return 0;
}
temp name这些变量就是在栈上定义的变量,但是需要注意的是,定义的内存不能超过栈的内存,否则会导致栈内存的泄露。
3.从堆中分配内存
在C语言中,想要从堆中分配内存就要调用mallo函数进行分配
#include"stdio.h"
#include <malloc.h>
//全局变量存在静态区
int a, b, c, d;
int array[10] = { 0 };
int main()
{
int temp = 0;
char naame[20] = { "Hello Word!" };
//从堆中分配内存,表示从堆上分配30个double大小的内存空间
char* p;
p = (char*)malloc(30 * sizeof(char));
//判断内存是否分配成功
if (p==NULL)
{
//分配失败
return 0;
}
//"HelloWorld\n"写入p指向的地址
sprintf(p, "%s", "HelloWorld\n");
//输出数据
printf("%s\n", p);
//释放内存空间
free(p);
return 0;
}
4.calloc()函数和realloc()函数
calloc()函数与malloc()函数有同样之处。也有类似之处。
short *p;
newmem=(short *)calloc(1000,sizeof(short));
通过这个样例,我们能够知道calloc()函数有两个參数。而且这两个函数都是size_t类型(unsigned int类型)的数。第一个參数在这里所说的是所须要开辟的内存单元数量。第二个參数是每一个单元的字节的大小。
void *calloc(size_t ,size_t);
calloc()函数另一个特性。它将块中的所有位都置为0。这也是calloc()函数和malloc()函数的差别,calloc()函数和malloc()函数的另外一个差别是他们请求内存数量的方式不一样。当然。free()函数也能够来释放calloc()函数分配的内存。
realloc()函数用来改动一个原先已经分配的内存的大小。使用这个函数,你能够让一块内存增大还是缩小。当扩大时。这块内存原先的内容会依旧保留,新添加的加入到原先的后面。缩小时,该内存的尾部部分内存去掉,剩余保留。
网友评论