10_动态内存
动态内存
动态分配和静态分配
动态分配:
在程序运行中, 根据需要自动分配所需空间
分配在堆区, 一般使用特定函数进行分配
静态分配:
1. 按事先规定大小分配内存空间, 如: int a[10] 2. 分配在栈区或全局变量区
动态内存申请的API
malloc 申请 堆区空间
#include<stdlib.h>
void * malloc(size_t size); //size 表示申请的空间字节数
函数的返回值:
成功: 返回空间起始地址
失败: NULL
特点: malloc 申请的堆区空间 不自动清0
申请int空间
int *p = NULL;
p = (int *)malloc(sizeof(int));
if (p == NULL)
{
return;
}
*p = 100;
printf("%d\n", *p);
free释放堆区空间
#include<stdlib.h>
void free(void *ptr); //ptr需要释放的堆区空间的起始地址
free(p); //p的权限不只是属于该进程, 可以由cpu自由分配, 内容不一定清0
memset内存设置函数
#include<string.h>
void *memset(void *s, int c, size_t n);
s: 空间的起始地址
c: 空间中每个字节填充的值
n: 空间的字节大小
例: 动态数组
int n = 0;
printf("请输入int元素的个数:");
scanf("%d", &n);
//根据元素个数申请空间
int *p = NULL;
p = (int *)malloc(n*sizeof(int));
if (p == NULL)
{
return;
}
//将堆区空间清0
memset(p, 0, n*sizeof(int));
//获取键盘输入
for (int i = 0; i < n; i++)
{
scanf("%d", p + i);
}
//遍历数组元素
for (int i = 0; i < n; i++)
{
printf("%d ", p[i]);
}
printf("\n");
calloc函数
#include<stdlib.h>
void *calloc(size_t nmemb, size_t size);
nmemb: 内存的块数
size: 每一块的字节数
返回值:
成功:堆区空间起始地址
失败: NULL
calloc会对申请的空间 自动清0
int n = 0;
printf("请输入int元素的个数:");
scanf("%d", &n);
//根据元素个数 申请空间
int *p = NULL;
p = (int *)calloc(n, sizeof(int));
if (p == NULL)
{
return ;
}
//获取键盘输入
for (int i = 0; i < n; i++)
{
scanf("%d", p+i);
}
for (int i = 0; i < n; i++)
{
printf("%d ", p[i]);
}
printf("\n");
realloc函数 追加空间
#include <stdlib.h>
void *realloc(void *ptr, size_t size);
ptr: 旧空间起始地址
size: 旧空间和新空间之和
返回值: 空间起始地址
printf("请输入添加新空间个数: ");
scanf("%d", &n2);
p = (int *)realloc(p, (n + n2)*sizeof(int));
inputAndOutput(p, n, n+n2);
内存泄漏
解决方案: free(p);
案例2:
解决方案: free(q);