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

C语言中动态内存分配 malloc realloc calloc 的使用和比较

2016-10-22 14:34 686 查看


1.malloc

作用:分配内存块

语法:void * malloc(size_t size);

参数

      size      要分配的字节

返回值

            1.内存充足返回该内存的指针

            2.内存不足则返回NULL

 

____________________________________________________________________


2.realloc

作用:重新分配内存块

语法:void * realloc(void* p, size_t size);

参数

     p      以前分配的内存块的指针

     size
新的大小     (以字节为单位)

 

返回值

            1.原内存块后内存充足则返回原指针

            2.原内存块后内存不够用返回新的地址

            3.内存不足则返回NULL

            4.size为0释放并返回NULL

 

—————————————————————————————————————

3.calloc

作用:分配n个长度为size的连续空间并初始化元素为0

语法:void * calloc(size_t n, size_t size);

参数

     n元素的个数

     size  
每个元素字节长度

返回值

            1.分配成功返回起始地址

            2.失败返回NULL

 

—————————————————————————————————————

举例子:

(一)malloc与calloc的对比

代码:

//环境  win7 64位  vs2008
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
int num;			//元素个数
int* p;				//内存块地址

scanf("%d",&num);
p = (int *)malloc(sizeof(int)*num);
printf("%x \n",p);		//打印malloc后的首地址

p = (int *)calloc(num,sizeof(int));
scanf("%d",&num);
printf("%x \n",p);		//打印calloc后的首地址

return 0;
}


调试过程:

1.malloc不会初始化元素的值而是被系统默认初始化为一个无效值



2.calloc会将元素初始化为0



(二)malloc与  realloc的对比

代码:

#include <stdio.h>
#include <stdlib.h>

//malloc与realloc的对比
int main(void)
{
int num = 0; //元素个数
int *p = NULL; //内存首块地址
int i = 0;

scanf("%d",&num); //输入元素个数
p = (int *)malloc(sizeof(int)*num);

printf("%x \n",p); //打印malloc分配空间后的首地址

scanf("%d",&num); //分配与malloc大小差不多的块
p = (int *)realloc(p,sizeof(int)*num);

for (i = 0; i < num; i++)
{
p[i] = i;
}
printf("%x \n",p); //打印realloc后的首地址

scanf("%d",&num); //配与malloc大小差很多的块
p = (int *)realloc(p,sizeof(int)*num);
for (i = 0; i < num; i++)
{
p[i] = i;
}
printf("%x \n",p); //再次打印realloc后的首地址
free(p); //记得free防止内存泄露

return 0;
}

从上一个对比中我们知道了malloc不会初始化元素的值,下面我们先来看一下realloc会不会初始化原始的值

1.下图可以看到malloc依然没有初始化



2.当分配和malloc分配大小差不多的块时,p没有改变说明还有足够的空间,还可以看到realloc分配空间的时候也不会初始化



3.当分配200个元素 时,此时没有足够的连续内存块空间分配,会返回新内存块的地址并把原来的内容复制过来



注意:分配完毕要释放内存,第一个例子忘记释放。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐