动态内存开辟

来源:互联网 发布:中国大学生网络党课 编辑:程序博客网 时间:2024/05/29 06:56
 动态内存开辟(malloc(),calloc(),free(),relloc())

首先,简单讲述静态内存开辟,对于书写一个c语言程序来说,第一步要做的就是开辟内存空间,其形式为:类型+空间名。例如:int age; Char name; double average ; 这样开辟的空间用来存放待处理的内容,该空间又称为变量,其中存放的内容可以被改变,即可多次被赋予内容,但是,在下一次存入内容的时候,原来的数据将不复存在,变量一旦开辟,便在内存中占一定大小,在非主函数中,该变量随着函数调用开始而开辟,一旦子函数结束,空间自动销毁,待下一次函数调用时,再重新开辟空间,那么,能不能找到一种方法,使得开辟的空间在需要的时候被开辟,用户不用时再销毁释放呢?
这里,我们引入动态内存开辟的概念。动态内存分配是指在程序执行的过程中,动态的分配或收回存储空间的方法,其不像数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据程序的需要即时分配,且分配的大小就是程序要求的大小。
malloc():译为存储器分配。malloc()是C语言中动态存储管理的一组标准库函数之一,其作用是在内存的动态存储区中分配一个长度为size的连续空间,其参数是一个无符号的整形数,返回值是一个指向所分配的连续储存域的起始地址的指针。另外,当函数未能成功分配存储空间时,返回NULL(空指针)。
故而,当在调用函数时,必须先判断是否为空指针(NULL),可用assert 断言,寒暑形式为:void * malloc(sizeof +类型),这里void*为任何指针类型,sizeof为求字节,例如: int p =(int )malloc(40);值得注意的是,在使用malloc ()开辟的内存块,内存大小是确定的,同样不允许越界访问:
给个梨子:
int main ()
{
int p=(int )malloc(40);
if(p==NULL)
{
printf(“out of memory\n”);
Exit(EXIT_FAILURE);
}

for(i=0;i<10;i++)
*(p+i)=10-i;
free(p);
P=NULL;
Return 0;
}
Calloc:函数使用形式int ptr=(int )calloc(10,sizeof(int));
举个栗子:将数组元素初始化为0;

int main()
{
int ptr=(int )calloc(10,sizeof(int));
if(ptr==NULL)
{ printf(“out of memeory\n”);
exit(EXIT_FRILURE);
}
free(ptr);
ptr=NULL;
return 0
}
下面,对于malloc函数,有以下几点需要十分注意:
1,malloc 函数与free配对使用
2,不能对动态开辟的空间越界访问
3,不能对NULL指针进行解引用操作
4,不能对已释放的内存再次使用
5,对动态开辟空间多次释放
6,不能对动态开辟空间的一部分释放
对于动态内存开辟,大概就浅谈到此吧,希望大家多多指教哦,发现问题并提出问题有奖励哦

原创粉丝点击