复习:存储类别内存分配动态分配内存

2024-09-01 22:36

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

目录

存储类别说明符

        自动变量(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/1128235

相关文章

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

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

MySQL 内存使用率常用分析语句

《MySQL内存使用率常用分析语句》用户整理了MySQL内存占用过高的分析方法,涵盖操作系统层确认及数据库层bufferpool、内存模块差值、线程状态、performance_schema性能数据... 目录一、 OS层二、 DB层1. 全局情况2. 内存占js用详情最近连续遇到mysql内存占用过高导致

最新Spring Security的基于内存用户认证方式

《最新SpringSecurity的基于内存用户认证方式》本文讲解SpringSecurity内存认证配置,适用于开发、测试等场景,通过代码创建用户及权限管理,支持密码加密,虽简单但不持久化,生产环... 目录1. 前言2. 因何选择内存认证?3. 基础配置实战❶ 创建Spring Security配置文件

go动态限制并发数量的实现示例

《go动态限制并发数量的实现示例》本文主要介绍了Go并发控制方法,通过带缓冲通道和第三方库实现并发数量限制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录带有缓冲大小的通道使用第三方库其他控制并发的方法因为go从语言层面支持并发,所以面试百分百会问到

java内存泄漏排查过程及解决

《java内存泄漏排查过程及解决》公司某服务内存持续增长,疑似内存泄漏,未触发OOM,排查方法包括检查JVM配置、分析GC执行状态、导出堆内存快照并用IDEAProfiler工具定位大对象及代码... 目录内存泄漏内存问题排查1.查看JVM内存配置2.分析gc是否正常执行3.导出 dump 各种工具分析4.