目录
一、动态内存分配
头文件:stdlib.h
1)malloc函数
malloc函数:malloc(int size)
用于分配一个大小为size的内存区域。申请的是字节,100则可以存放25个整数
例如:char* p=(char*)malloc(100)
#include<stdio.h>
int main()
{
//int* p = (int*)malloc(100);
//或者如下申请内存
int* p = (int*)malloc(25 * sizeof(int));
*p = 10;
*(p + 1) = 20;
printf("%d\t", *p);
printf("%d\t", *(p + 1));
//[]也有解引用的作用p[0]等于*p
printf("%d\t%d", p[0], p[1]);
}
2)calloc函数
calloc函数:calloc(unsigned n,int size)
用于分配n个大小为size的连续内存区域,可以为一维数组开辟动态内存空间
例如:int* p=(int*)calloc(10,sizeof(int));
int* p = (int*)calloc(5, sizeof(int));//会默认初始化地址为0
for (int i = 0; i < 5; i++)
{
printf("%d\t", *(p+i));
}
//后增加的内存不会默认初始化
realloc(p, 5 * sizeof(int));//增加5个内存 int字节数为4
for (int i = 0; i < 10; i++)
{
printf("%d\t", *(p + i));
}
3)realloc函数
不会初始化内存数据
realloc函数:realloc(void* p,unsigned int size)
用于改变已经通过malloc函数或calloc函数开辟的内存空间的大小
例如:realloc(p,50*sizeof(int))
注意:会更改覆盖扩容的地址的原有值。
int* p = (int*)calloc(5, sizeof(int));//会默认初始化地址为0
for (int i = 0; i < 5; i++)
{
printf("%d\t", *(p+i));
}
//后增加的内存不会默认初始化
realloc(p, 5 * sizeof(int));//增加5个内存 int字节数为4
for (int i = 0; i < 10; i++)
{
printf("%d\t", *(p + i));
}
4)free函数
free函数:void free(void* p)
用于释放指针变量所指的动态内存空间
例如:free(p);
int* p = (int*)calloc(5, sizeof(int));//会默认初始化地址为0
for (int i = 0; i < 5; i++)
{
printf("%d\t", *(p+i));
}
//后增加的内存不会默认初始化
realloc(p, 5 * sizeof(int));//增加5个内存 int字节数为4
for (int i = 0; i < 10; i++)
{
printf("%d\t", *(p + i));
}
free(p);
二、内存扩容
#include<stdio.h>
int main()
{
int* p = (int*)malloc(10 * sizeof(int));//分配初始内存
for (int i = 0; i < 10; i++)
{
p[i] = i + 1;
}
for (int i = 0; i < 10; i++)
{
printf("%d\t",p[i]);
}
int* q = (int*)malloc(20 * sizeof(int));//增加内存
//将旧内存p的数据保存到新的内存q上
for (int i = 0; i < 10; i++)
{
q[i]=p[i];
}
free(p);//释放的不是指针变量p 释放指针变量p指向的内存
//令p指向的新的内存
p = q;
for (int i = 10; i < 20; i++)
{
p[i] = i + 1;
}
for (int i = 0; i < 20; i++)
{
printf("%d\t",p[i]);
}
}