复习:存储类别内存分配

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

相关文章

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

HDFS—存储优化(纠删码)

纠删码原理 HDFS 默认情况下,一个文件有3个副本,这样提高了数据的可靠性,但也带来了2倍的冗余开销。 Hadoop3.x 引入了纠删码,采用计算的方式,可以节省约50%左右的存储空间。 此种方式节约了空间,但是会增加 cpu 的计算。 纠删码策略是给具体一个路径设置。所有往此路径下存储的文件,都会执行此策略。 默认只开启对 RS-6-3-1024k

NameNode内存生产配置

Hadoop2.x 系列,配置 NameNode 内存 NameNode 内存默认 2000m ,如果服务器内存 4G , NameNode 内存可以配置 3g 。在 hadoop-env.sh 文件中配置如下。 HADOOP_NAMENODE_OPTS=-Xmx3072m Hadoop3.x 系列,配置 Nam

速了解MySQL 数据库不同存储引擎

快速了解MySQL 数据库不同存储引擎 MySQL 提供了多种存储引擎,每种存储引擎都有其特定的特性和适用场景。了解这些存储引擎的特性,有助于在设计数据库时做出合理的选择。以下是 MySQL 中几种常用存储引擎的详细介绍。 1. InnoDB 特点: 事务支持:InnoDB 是一个支持 ACID(原子性、一致性、隔离性、持久性)事务的存储引擎。行级锁:使用行级锁来提高并发性,减少锁竞争

JVM内存调优原则及几种JVM内存调优方法

JVM内存调优原则及几种JVM内存调优方法 1、堆大小设置。 2、回收器选择。   1、在对JVM内存调优的时候不能只看操作系统级别Java进程所占用的内存,这个数值不能准确的反应堆内存的真实占用情况,因为GC过后这个值是不会变化的,因此内存调优的时候要更多地使用JDK提供的内存查看工具,比如JConsole和Java VisualVM。   2、对JVM内存的系统级的调优主要的目的是减少

JVM 常见异常及内存诊断

栈内存溢出 栈内存大小设置:-Xss size 默认除了window以外的所有操作系统默认情况大小为 1MB,window 的默认大小依赖于虚拟机内存。 栈帧过多导致栈内存溢出 下述示例代码,由于递归深度没有限制且没有设置出口,每次方法的调用都会产生一个栈帧导致了创建的栈帧过多,而导致内存溢出(StackOverflowError)。 示例代码: 运行结果: 栈帧过大导致栈内存

理解java虚拟机内存收集

学习《深入理解Java虚拟机》时个人的理解笔记 1、为什么要去了解垃圾收集和内存回收技术? 当需要排查各种内存溢出、内存泄漏问题时,当垃圾收集成为系统达到更高并发量的瓶颈时,我们就必须对这些“自动化”的技术实施必要的监控和调节。 2、“哲学三问”内存收集 what?when?how? 那些内存需要回收?什么时候回收?如何回收? 这是一个整体的问题,确定了什么状态的内存可以

NGINX轻松管理10万长连接 --- 基于2GB内存的CentOS 6.5 x86-64

转自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=190176&id=4234854 一 前言 当管理大量连接时,特别是只有少量活跃连接,NGINX有比较好的CPU和RAM利用率,如今是多终端保持在线的时代,更能让NGINX发挥这个优点。本文做一个简单测试,NGINX在一个普通PC虚拟机上维护100k的HTTP

【408数据结构】散列 (哈希)知识点集合复习考点题目

苏泽  “弃工从研”的路上很孤独,于是我记下了些许笔记相伴,希望能够帮助到大家    知识点 1. 散列查找 散列查找是一种高效的查找方法,它通过散列函数将关键字映射到数组的一个位置,从而实现快速查找。这种方法的时间复杂度平均为(

PHP原理之内存管理中难懂的几个点

PHP的内存管理, 分为俩大部分, 第一部分是PHP自身的内存管理, 这部分主要的内容就是引用计数, 写时复制, 等等面向应用的层面的管理. 而第二部分就是今天我要介绍的, zend_alloc中描写的关于PHP自身的内存管理, 包括它是如何管理可用内存, 如何分配内存等. 另外, 为什么要写这个呢, 因为之前并没有任何资料来介绍PHP内存管理中使用的策略, 数据结构, 或者算法. 而在我们