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

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

相关文章

Ubuntu如何分配​​未使用的空间

《Ubuntu如何分配​​未使用的空间》Ubuntu磁盘空间不足,实际未分配空间8.2G因LVM卷组名称格式差异(双破折号误写)导致无法扩展,确认正确卷组名后,使用lvextend和resize2fs... 目录1:原因2:操作3:报错5:解决问题:确认卷组名称​6:再次操作7:验证扩展是否成功8:问题已解

一文详解SpringBoot中控制器的动态注册与卸载

《一文详解SpringBoot中控制器的动态注册与卸载》在项目开发中,通过动态注册和卸载控制器功能,可以根据业务场景和项目需要实现功能的动态增加、删除,提高系统的灵活性和可扩展性,下面我们就来看看Sp... 目录项目结构1. 创建 Spring Boot 启动类2. 创建一个测试控制器3. 创建动态控制器注

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

Java内存分配与JVM参数详解(推荐)

《Java内存分配与JVM参数详解(推荐)》本文详解JVM内存结构与参数调整,涵盖堆分代、元空间、GC选择及优化策略,帮助开发者提升性能、避免内存泄漏,本文给大家介绍Java内存分配与JVM参数详解,... 目录引言JVM内存结构JVM参数概述堆内存分配年轻代与老年代调整堆内存大小调整年轻代与老年代比例元空

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

MySQL之InnoDB存储引擎中的索引用法及说明

《MySQL之InnoDB存储引擎中的索引用法及说明》:本文主要介绍MySQL之InnoDB存储引擎中的索引用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录1、背景2、准备3、正篇【1】存储用户记录的数据页【2】存储目录项记录的数据页【3】聚簇索引【4】二

MySQL之InnoDB存储页的独立表空间解读

《MySQL之InnoDB存储页的独立表空间解读》:本文主要介绍MySQL之InnoDB存储页的独立表空间,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、独立表空间【1】表空间大小【2】区【3】组【4】段【5】区的类型【6】XDES Entry区结构【

SQLite3 在嵌入式C环境中存储音频/视频文件的最优方案

《SQLite3在嵌入式C环境中存储音频/视频文件的最优方案》本文探讨了SQLite3在嵌入式C环境中存储音视频文件的优化方案,推荐采用文件路径存储结合元数据管理,兼顾效率与资源限制,小文件可使用B... 目录SQLite3 在嵌入式C环境中存储音频/视频文件的专业方案一、存储策略选择1. 直接存储 vs

springboot如何通过http动态操作xxl-job任务

《springboot如何通过http动态操作xxl-job任务》:本文主要介绍springboot如何通过http动态操作xxl-job任务的问题,具有很好的参考价值,希望对大家有所帮助,如有错... 目录springboot通过http动态操作xxl-job任务一、maven依赖二、配置文件三、xxl-