九、内存管理、位运算

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");

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐