free的用法:

(1)free不能只释放一部分内存,是释放一整块开辟的内存

(2)free不能释放非动态开辟的内存

    int a=10;

    int*p=&a;

    free(p); 错误

(3)free不能释放多次内存

    int*ptr1=p;

    int*ptr2=p;

    free(ptr1);

    free(ptr2); 错误

Malloc:

#include<stdio.h>
#include<stdlib.h>
int main()
{
int*p = (int*)malloc(10 * sizeof(int));
int i = 0;
if (p == NULL)
{
printf("out of memory\n");
exit(0);
}
for (i = 0; i < 10; i++)
{
p[i] = i + 1;
}
for (i = 0; i < 10; i++)
{
printf("%d ", p[i]);
}
printf("\n");
free(p);
getchar();
return 0;
}

结果:1 2 3 4 5 6 7 8 9 10

封装成函数:

#define MALLOC(count,type)\
(type *)malloc(count*sizeof(type))//封装
int main()
{
int*p = MALLOC(10,int);//调用,不用判断p=NULL
int i = 0;
for (i = 0; i < 10; i++)
{
p[i] = i+1;
}
for (i = 0; i < 10; i++)
{
printf("%d\n", p[i]);
}
free(p);
getchar();
return 0;
}
Calloc:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int*p = (int*)calloc(100,sizeof(int));
int i = 0;
int*q = NULL;
for (i = 0; i < 100; i++)
{
p[i] = i + 1;
}
q = realloc(p, 200 * sizeof(int));
for (i = 0; i < 200; i++)
{
printf("%d ", p[i]);
}
printf("\n");
free(p);
getchar();
return 0;
}

例:动态开辟二维数组

#include<stdio.h>
#include<stdlib.h>
int main()
{
int(*p)[4] = (int(*)[4])malloc(3 * 4 * sizeof(int));
int i = 0;
int j = 0;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 4; j++)
{
p[i][j] = i * 4 + j + 1;
}
}
for (i = 0; i < 3; i++)
{
for (j = 0; j < 4; j++)
{
printf("%d ", p[i][j]);
}
printf("\n");
}
free(p);
getchar();
return 0;
}

结果:

1 2 3 4

5 6 7 8

9 10 11 12