快速了解C语言基础(18)(内存管理)
九、内存管理、位运算
1.操作系统内存管理
1)内存分布:

2)堆和栈的区别:
栈区:
(1)栈区用来保存局部变量、函数的形参返回值、及函数调用时的保护现场;
(2)栈区由操作系统自动管理;
(3)栈区默认大小为8M, 比堆区空间小;
(4)栈的访问效率要比堆的访问效率高;
堆区:
(1)堆区由开发人员手动申请和释放,使用完时及时释放,否则造成内存泄露。
(2)堆区空间比栈空间大,访问效率相对较低。
堆区空间使用场景:
在函数中开辟的空间,希望随着函数结束,该空间任然存在,可以去堆上开辟。
当需要的空间比较大时,可以去堆上开辟,栈区空间有限,默认8M。
堆区空间使用(动态内存分配):
void *malloc(size_t size);
功能:向堆区申请内存空间
参数:
size:申请的空间字节数
返回值:
成功:返回申请到的空间首地址
失败:NULL
void free(void *ptr);
功能:释放申请的堆区空间
参数:
ptr:申请到的堆区的空间首地址。
void *calloc(size_t nmemb, size_t size);
功能:向堆区申请数组空间,并清空成0
参数:
nmemb:申请的数组的元素个数
size:数组中的每个元素占的字节数
返回值:
成功:返回申请到的空间首地址
失败:NULL
示例代码:
int *p = malloc(4);
if (NULL == p)
{
printf("malloc error\n");
return 0;
}
*p = 10;
printf("*p = %d\n", *p);
free(p);
struct stu *ps = malloc(sizeof(struct stu));
if (NULL == ps)
{
printf("malloc error\n");
return 0;
}
//ps->name = "zhangsan"; X
strcpy(ps->name, "zhangsan");
ps->age = 10;
ps->score = 100;
printf("%s %d %d\n", ps->name, ps->age, ps->score);
free(ps);
char *pstr = malloc(100);
if (NULL == pstr)
{
printf("malloc error\n");
return 0;
}
strcpy(pstr, "hello world");
printf("pstr->%s\n", pstr);
free(pstr);
内存泄露:程序运行过程中,堆区申请的空间在使用完没有释放,则造成内存泄露。
避免内存泄露:堆区申请的空间使用完,及时使用free()进行释放。
3)动态数组:
int *pa = malloc(ARRAY_LEN*sizeof(int));
if (NULL == pa)
{
printf("malloc error\n");
return 0;
}
for (int i = 0; i < ARRAY_LEN; ++i)
{
pa[i] = i;
}
for (int i = 0; i < ARRAY_LEN; ++i)
{
printf("%d ", pa[i]);
}
printf("\n");
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)