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

0 0
原创粉丝点击