动态内存分配

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态内存分配相关的知识,希望对你有一定的参考价值。

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 


以上是关于动态内存分配的主要内容,如果未能解决你的问题,请参考以下文章

C - 读取文件并将文本放入具有动态内存分配的字符指针

简单动态内存分配实现(附代码)

golang 转到片段以观察运行时行为和内存分配

动态内存分配与静态内存分配

需要有关 C++ 中二维数组的动态内存分配的帮助

删除动态分配的内存