内存管理
动态内存:通常当用户无法确定空间大小,或者空间太大,栈上无法分配时采用。
静态内存:在程序开始运行时有编译器分配的内存,在编译时完成,不占用CPU资源。
两者区别:
- 静态内存的分配是在程序开始编译时完成的,不占用CPU资源;而动态内存的分配是在程序运行时完成的,动态内存的分配与释放都是占用CPU资源的。
- 静态内存是在栈上分配的;动态内存是在堆上分配的。
- 动态内存分配需要指针和引用数据类型的支持,而静态内存不需要。
- 静态内存分配是在编译前就已经确定了内存块的大小,属于按计划分配内存;而动态内存的分配是在程序运行过程中,根据需要随时分配的,属于按需分配。
- 静态内存的控制权是交给编译器的,而动态内存的控制权是由自己决定的。
分配内存
-
malloc()函数
函数原型:
void *malloc(unsigned int size);
该函数的功能是分配长度为size字节的内存块。
如果分配成功,则返回指向被分配内存的指针;否则返回空指针NULL。注意:当内存不再使用时,要使用free()函数释放内存块。
分配内存大小和返回指针类型都有自己决定。
#include<stdio.h>
#include<stdlib.h>
int main()
{
int* buffer;
buffer = (int*)malloc(400);
free(buffer);
return 0;
}
2.calloc()函数
函数原型:
void *calloc(unsigned n,unsigned size);
该函数的功能是在内存的动态区存储中分配n个长度为size的内存块。
分配结果和malloc()相同,也要用free释放。
#include<stdio.h>
#include<stdlib.h>
int main()
{
int* buffer_m;
int* buffer_c;
int **buffer;
int a[10];
buffer_m = (int *)malloc(20 * sizeof(int));
free(buffer_m);
buffer_c = (int *)calloc(20, sizeof(int)); //和malloc效果相同
free(buffer_c);
return 0;
}3.realloc()函数
函数原型:
void *realloc(void *mem_address,unsigned int newsize);
该函数的功能是改变原mem_adress所指向的内存区域的大小为newsize。
重新分配空间并将原空间内容复制过来,成功返回地址,否则返回NULL。
4.memset()函数
函数原型为:
void *memset(void *s,char ch,unsigned n);
该函数功能是设置s中所有的字节为ch,s数组的大小为n。
注意:是按字节赋值
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void show(int *a,int n)
{
int i = 0;
for (i = 0; i < n; i++)
{
printf("%d ", a[i]);
}
printf("\n----------\n");
}
int main()
{
int a[10] = { 1,2,3,4,5 };
int i;
memset(a, 0, sizeof(a)); //都赋值为0,
show(&a,10);
memset(a, -1, sizeof(a)); //都赋值为-1,
show(&a, 10);
memset(a, 1, sizeof(a)); //都赋值为1???
show(&a, 10);
return 0;
}
释放内存
动态申请内存一定要手动释放该内存空间。free()
函数原型:
void free(void *memblock);

浙公网安备 33010602011771号