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个元素 时,此时没有足够的连续内存块空间分配,会返回新内存块的地址并把原来的内容复制过来
注意:分配完毕要释放内存,第一个例子忘记释放。
相关文章推荐
- C语言:使用realloc函数对malloc或者calloc动态分配的内存大小进行扩展
- MTK 使用数组模拟动态内存分配
- C语言——指针与结构体 内存的动态分配
- 链表的C语言实现(含动态内存分配)
- C语言实现用程序数据段空间模拟内存的动态分配
- 链表的C语言实现(含动态内存分配)
- 生存期小于函数生存期的变量不要使用动态内存分配
- 链表的C语言实现(含动态内存分配)
- 编写一个函数,此函数使用动态存储分配来产生一个字符串的副本。例如函数为strclone,则调用p=strclone(str),将会为一个新的字符串分配和str占内存大小相同的一个字符串,并将字符串st
- 【转】c语言中内存的动态分配与释放(多维动态数组构建)
- C语言三个内存分配函数比较,malloc calloc realloc
- c语言 输出变量的地址,动态的观察内存的分配。
- 13、C语言中动态内存分配与指向它的指针变量
- c++ 基类、派生类都使用了动态内存分配的实例
- c语言中的动态内存分配~
- 模拟实现c语言中的动态内存分配malloc函数
- c语言中内存的动态分配与释放(多维动态数组构建)
- C语言中malloc、calloc、realloc动态内存分配的理解
- C语言学习9: malloc动态内存存储,动态内存分配去空格字符增长版,动态内存分配去符号incr增长版,型参和返回值都是int型的函数的指针,main函数的地址也可以用指针指向,typedef定义函数指针,函数定义与嵌套的作用,返回函数指针类型,const作用
- 输入N,在屏幕上打印出N X N 的矩阵,使用动态内存分配 int ** num