malloc与calloc,realloc动态内存的用法
来源:互联网 发布:当代文学论文选题知乎 编辑:程序博客网 时间:2024/05/17 06:18
这次我发的是嵌入式中的内存分配的一些用法和一些注意,当然我们对动态分配空间也不会太陌生,malloc的用法我们在编程的过程中都会用到,不可能在一个大的程序中都用静态的方法,先说malloc与calloc的用法,后面说realloc的用法,这两个的用法比较的接近,先看代码:
#include <stdio.h>
#include <stdlib.h>
void fun_heap1()
{
int *pa;
int i;
pa = (int*)malloc(sizeof(int)*10);
if(pa!= NULL)
{
printf("pa = %x\n",(unsigned int)pa);
for(i = 0;i<10;i++)
{
*(pa+i) = i;
}
for(i = 0;i<10;i++)
{
printf("pa[%d] = %d\n",i,pa[i]);
}
free(pa);
}
}
void fun_heap2()
{
unsigned int *pa;
int i;
pa = (unsigned int *)calloc(sizeof(unsigned int),10);
if(pa != NULL)
{
printf("calloc pa= %x\n",(unsigned int)pa);
for(i = 0;i<10;i++)
{
printf("pa[%d] = %d\n",i,pa[i]);
}
free(pa);
}
}
int main()
{
fun_heap1();
fun_heap2();
return 0;
}
这个是两个例子,这其中有malloc的用法也有calloc的用法,具体有什么区别,同样是分配了40个字节的大小,calloc在后面比malloc多了一个数字,这个数字就是分配多少的字节的数量,但是不同的地方在那里,malloc分配的是40个字节,其中可以使用char型的等。只要不超过内存就行,calloc的特点是什么,就是在分配内存后堆内存区域的内容置为0。下面是结果:
pa = 8a26008
pa[0] = 0
pa[1] = 1
pa[2] = 2
pa[3] = 3
pa[4] = 4
pa[5] = 5
pa[6] = 6
pa[7] = 7
pa[8] = 8
pa[9] = 9
calloc pa= 8a26008
pa[0] = 0
pa[1] = 0
pa[2] = 0
pa[3] = 0
pa[4] = 0
pa[5] = 0
pa[6] = 0
pa[7] = 0
pa[8] = 0
pa[9] = 0
realloc这个我们都不怎么用,但是这个的功能比较多,有三种功能:
1.当指针为NULL时,作为malloc使用、
2.当重分配内存大小为0的时候,作为free使用,释放内存。
3.当指针和重分配内存大小均不为0的时候,根据指针指向的堆内存区域的情况和指定大小重新分配内存。
测试5种该函数的使用方式:指针为NULL时;重分配内存大小为0时;重分配内存时缩小内存、扩大内存(不需移动指针)、扩大内存(需移动指针)。代码如下,需要自己理解:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void fun_heap3()
{
char *p;
int i;
p = (char *)realloc(NULL,sizeof(char) *20);
if(p != NULL)
{
strcpy(p,"hello world");
printf("&p = %x,p = %s\n",(unsigned int)p,(unsigned int)p);
p = (char *)realloc(p,0);
printf("p = %x\n",(unsigned int)p);
}
}
void fun_heap5()
{
int *p;
int i;
p = (int *)malloc(sizeof(int)*10);
if(p != NULL)
{
printf("malloc p = %x\n",(unsigned int)p);
for(i = 0;i<10;i++)
{
*(p+i) = i;
printf("p[%d] = %d\n",i,p[i]);
}
}
p = (int *)realloc(p,(sizeof(int)*6));
if(p != NULL)
{
printf("realloc p = %x\n",(unsigned int)p);
for(i = 0;i<6;i++)
{
printf("p[%d] = %d\n",i,p[i]);
}
}
free(p);
}
void fun_heap6()
{
int *p;
int i;
p = (int *)malloc(sizeof(int)*6);
if(p != NULL)
{
printf("malloc p = %x\n",(unsigned int)p);
for(i = 0;i<6;i++)
{
*(p+i) = i;
printf("p[%d] = %d\n",i,p[i]);
}
}
p = (int *)realloc(p,(sizeof(int)*10));
if(p != NULL)
{
printf("realloc p = %x\n",(unsigned int)p);
for(i = 0;i<10;i++)
{
printf("p[%d] = %d\n",i,p[i]);
}
}
free(p);
}
void fun_heap7()
{
int *p,*q;
int i;
p = (int *)malloc(sizeof(int)*6);
if(p != NULL)
{
printf("malloc p = %x\n",(unsigned int)p);
for(i = 0;i<6;i++)
{
*(p+i) = i;
printf("p[%d] = %d\n",i,p[i]);
}
}
q = (int *)malloc(sizeof(int)*10);
printf("malloc q = %x\n",(unsigned int)q);
p = (int *)realloc(p,(sizeof(int)*10));
if(p != NULL)
{
printf("realloc p = %x\n",(unsigned int)p);
for(i = 0;i<10;i++)
{
printf("p[%d] = %d\n",i,p[i]);
}
}
free(p);
free(q);
}
int main()
{
fun_heap3();
fun_heap5();
fun_heap6();
fun_heap7();
}
结果:
&p = 8f96008,p = hello world
p = 0
malloc p = 8f96020
p[0] = 0
p[1] = 1
p[2] = 2
p[3] = 3
p[4] = 4
p[5] = 5
p[6] = 6
p[7] = 7
p[8] = 8
p[9] = 9
realloc p = 8f96020
p[0] = 0
p[1] = 1
p[2] = 2
p[3] = 3
p[4] = 4
p[5] = 5
malloc p = 8f96020
p[0] = 0
p[1] = 1
p[2] = 2
p[3] = 3
p[4] = 4
p[5] = 5
realloc p = 8f96050
p[0] = 0
p[1] = 1
p[2] = 2
p[3] = 3
p[4] = 4
p[5] = 5
p[6] = 6
p[7] = 0
p[8] = 0
p[9] = 0
malloc p = 8f96020
p[0] = 0
p[1] = 1
p[2] = 2
p[3] = 3
p[4] = 4
p[5] = 5
malloc q = 8f96050
realloc p = 8f96080
p[0] = 0
p[1] = 1
p[2] = 2
p[3] = 3
p[4] = 4
p[5] = 5
p[6] = 6
p[7] = 0
p[8] = 0
p[9] = 0
- malloc与calloc,realloc动态内存的用法
- calloc、malloc、realloc的用法与区别
- C语言动态内存管理malloc、calloc、realloc、free的用法和注意事项
- 动态内存分配函数malloc,calloc,realloc
- 动态内存开辟malloc,calloc,realloc简述
- 动态内存开辟(malloc calloc realloc)
- C语言:动态内存malloc,calloc,realloc
- C/C++ 动态存储分配 malloc calloc realloc函数的用法与区别
- realloc,malloc与calloc的用法[转]
- 内存管理,malloc,calloc,realloc的使用
- malloc与calloc、realloc
- malloc、calloc 与 realloc
- 关于malloc calloc realloc的用法
- malloc、calloc、realloc的用法及区别
- malloc,realloc,calloc的用法及区别
- malloc、realloc、calloc的一些用法
- malloc 与 calloc 与 realloc 的区别
- malloc,realloc,calloc的介绍与区别
- 贪心算法基础(一)——数列极差
- 如何加快C++代码的编译速度
- html页面上含有<>,括号中是英文的页面上不显示
- 引导Ubuntu
- 内存对齐方式的总结 如何计算结构体所占内存的大小
- malloc与calloc,realloc动态内存的用法
- 一个EXTJS与JSP连接把数据写入数据库的例子
- WebView显示320*50的广告不能铺满网页宽,使用ViewPoint适配
- 图基本算法 ,图的表示方法 邻接矩阵 邻接表
- RAC环境维护常用命令
- Android WebView 缓存处理
- android中图片的三级缓存cache策略(内存/文件/网络)
- Android入门:封装一个HTTP请求的辅助类
- 点菜问题_1152