复习:存储类别内存分配

2024-09-01 20:44

本文主要是介绍复习:存储类别内存分配,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

存储类别说明符

        自动变量(auto)

        寄存器变变量(register)

        块作用域的静态变量(static)

        外部链接的静态变量(external)

内存分配

        概念回顾

        动态分配内存

        malloc函数

        free函数

        回顾问题:利用malloc和free的重要特性

存储类别说明符

        自动变量(auto)

            特征:自动存储期、块作用域、无链接

            块作用域、无链接:意味着只有在变量所在的块中,才能通过变量名访问

            问题引入:块是什么?

            1.在内层块中声明同名变量,内层块隐藏外层块定义。

#include<stdio.h>
int main()
{auto int x = 30;printf("1.x = %d %p\n", x, &x);{auto int x = 77;printf("2.x = %d %p\n", x, &x);}printf("3.x = %d %p\n", x, &x);while (x++ < 33)//递增的是原始的x(即x = 30){int x = 100;x++;printf("4.x = %d %p\n", x, &x);}printf("5.x = %d %p\n", x, &x);return 0;
}
//1.x = 30  000000969EAFF8C4
//2.x = 77  000000969EAFF8E4
//3.x = 30  000000969EAFF8C4
//4.x = 101 000000969EAFF904
//4.x = 101 000000969EAFF904
//4.x = 101 000000969EAFF904
//5.x = 34  000000969EAFF8C4
//-------------------------
//1.3.5的地址均为000000E8B059FCE4:说明原始的x没有消失。
//4.说明while每轮迭代结束,新x变量就会被销毁。

        寄存器变变量(register)

Day 15:变量的作用域和生命周期icon-default.png?t=N7T8https://blog.csdn.net/2301_76163403/article/details/141463586?spm=1001.2014.3001.5501

        块作用域的静态变量(static)

        定义:该变量在内存中原地不动,而非值不变。

        特征:静态存储期、块作用域、无链接。

        问题引入:静态变量和普通变量本质的区别是初始化的时点。

        函数体内的fade变量:每次调用都会被初始化。

        static 修饰的stay变量:只在编译整个程序时才被初始化一次。

#include<stdio.h>
void trystatic(void);
int main()
{int count;for (count = 1; count < 4; count++){printf("count = %d ", count);trystatic();}return 0;
}
void trystatic(void)
{int fade = 1;static int stay = 1;printf("fade = %d stay = %d\n", fade++, stay++);
}
//count = 1 fade = 1 stay = 1
//count = 2 fade = 1 stay = 2
//count = 3 fade = 1 stay = 3
//-------------------------
//fade和static修饰的stay的值变化

        扩展结论:静态变量和外部变量在程序被载入内存时已执行完毕。

        外部链接的静态变量(external)

        特征:静态存储期、文件作用域、外部链接

        global.c文件:

int global_a;//未初始化的外部变量:自动初始化为0。(和自动变量差异)
int global_b = 10;
int global_c = 3 + 8;

        main.c文件:

#include<stdio.h>
extern int global_a;
extern int global_b;
extern int global_c;
int main()
{printf("global_a = %d\n", global_a);printf("global_b = %d\n", global_b);printf("global_c = %d\n", global_c);return 0;
}
//global_a = 0
//global_b = 10
//global_c = 11

内存分配

        概念回顾

        概念:所有程序都必须预留足够的内存来储存程序使用的数据。

        回顾:静态数据在程序载入时分配内存,自动数据在程序执行块时分配内存。

        自动分配的内存:

#include<stdio.h>
int main()
{float a;char place[] = "hello world";char place2[100];return 0;
}

        动态分配内存

        头文件:#include <stdlib.h>

        重要特性:动态分配内存的存储期:从malloc()分配内存到free()释放内存为止。

        问题引入:当fun函数执行完毕后,a的内存空间会被释放,p指向了一个不再有效的地址。

#include<stdio.h>
int* fun();
int main()
{int* p = NULL;p = fun();printf("%d\n", *p);return 0;
}
int* fun()
{int a = 10;return &a;
}

        malloc函数

        作用:找到合适的空闲内存块。

        语法:void *  malloc(<所需内存的字节数>);

        返回:空闲内存块的首字节地址。

        free函数

        作用:释放malloc函数分配的内存。

        语法:void free(<malloc返回的地址>);

        回顾问题:

         利用malloc和free的重要特性

#include<stdio.h>
int* fun();
int main()
{int* p = NULL;p = fun();printf("%d\n", *p);free(p);return 0;
}
int* fun()
{int* p = NULL;p = malloc(sizeof(int));if (NULL == p){printf("malloc failed!\n");return NULL;}*p = 10;return p;
}

这篇关于复习:存储类别内存分配的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1128000

相关文章

Python内存管理机制之垃圾回收与引用计数操作全过程

《Python内存管理机制之垃圾回收与引用计数操作全过程》SQLAlchemy是Python中最流行的ORM(对象关系映射)框架之一,它提供了高效且灵活的数据库操作方式,本文将介绍如何使用SQLAlc... 目录安装核心概念连接数据库定义数据模型创建数据库表基本CRUD操作创建数据读取数据更新数据删除数据查

MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决

《MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决》MyBatis默认开启一级缓存,同一事务中循环调用查询方法时会重复使用缓存数据,导致获取的序列主键值均为1,... 目录问题原因解决办法如果是存储过程总结问题myBATis有如下代码获取序列作为主键IdMappe

k8s搭建nfs共享存储实践

《k8s搭建nfs共享存储实践》本文介绍NFS服务端搭建与客户端配置,涵盖安装工具、目录设置及服务启动,随后讲解K8S中NFS动态存储部署,包括创建命名空间、ServiceAccount、RBAC权限... 目录1. NFS搭建1.1 部署NFS服务端1.1.1 下载nfs-utils和rpcbind1.1

Redis高性能Key-Value存储与缓存利器常见解决方案

《Redis高性能Key-Value存储与缓存利器常见解决方案》Redis是高性能内存Key-Value存储系统,支持丰富数据类型与持久化方案(RDB/AOF),本文给大家介绍Redis高性能Key-... 目录Redis:高性能Key-Value存储与缓存利器什么是Redis?为什么选择Redis?Red

k8s容器放开锁内存限制问题

《k8s容器放开锁内存限制问题》nccl-test容器运行mpirun时因NCCL_BUFFSIZE过大导致OOM,需通过修改docker服务配置文件,将LimitMEMLOCK设为infinity并... 目录问题问题确认放开容器max locked memory限制总结参考:https://Access

MyBatis-plus处理存储json数据过程

《MyBatis-plus处理存储json数据过程》文章介绍MyBatis-Plus3.4.21处理对象与集合的差异:对象可用内置Handler配合autoResultMap,集合需自定义处理器继承F... 目录1、如果是对象2、如果需要转换的是List集合总结对象和集合分两种情况处理,目前我用的MP的版本

Redis实现高效内存管理的示例代码

《Redis实现高效内存管理的示例代码》Redis内存管理是其核心功能之一,为了高效地利用内存,Redis采用了多种技术和策略,如优化的数据结构、内存分配策略、内存回收、数据压缩等,下面就来详细的介绍... 目录1. 内存分配策略jemalloc 的使用2. 数据压缩和编码ziplist示例代码3. 优化的

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

Python内存优化的实战技巧分享

《Python内存优化的实战技巧分享》Python作为一门解释型语言,虽然在开发效率上有着显著优势,但在执行效率方面往往被诟病,然而,通过合理的内存优化策略,我们可以让Python程序的运行速度提升3... 目录前言python内存管理机制引用计数机制垃圾回收机制内存泄漏的常见原因1. 循环引用2. 全局变

使用SpringBoot+InfluxDB实现高效数据存储与查询

《使用SpringBoot+InfluxDB实现高效数据存储与查询》InfluxDB是一个开源的时间序列数据库,特别适合处理带有时间戳的监控数据、指标数据等,下面详细介绍如何在SpringBoot项目... 目录1、项目介绍2、 InfluxDB 介绍3、Spring Boot 配置 InfluxDB4、I