`
kuwoleft
  • 浏览: 1086533 次
文章分类
社区版块
存档分类
最新评论

DS计划C深入学习项目:【总结】【变量】变量的存储域

 
阅读更多

如果要加入此计划:

1、 方式1 :加入 QQ 群: 93684322

2、 方式2 :加入 CSDN 群组: DS计划

1.1 变量存储域

1.1.1 一个示例

pang123hui首先提供了一个网上流传的学习代码示例:

int a = 0; //全局区

void main()

{

int b; //栈

char s[] = “abc”; //s在栈,abc在文字常量区

char *p1,*p2; //栈

char *p3 = "123456"; //123456在常量区,p3在栈上

static int c =0; //全局区

p1 = (char *)malloc(10); //p1在栈,分配的10字节在堆

p2 = (char *)malloc(20); //p2在栈,分配的20字节在堆

strcpy(p1, "123456"); //123456放在常量区

}

这个代码示例中出现了“全局区”,“栈”,“文字常量区”,“堆”等词语。为了统一,我们使用《C专家编程》中的说法:堆栈段,BSS段,数据段,文本段。

各个段的作用如下:

1、 文本段:包含程序的指令,它在程序的执行过程中一般不会改变。

2、 数据段:包含了经过初始化的全局变量和静态变量,以及他们的值。

3、 BSS段:包含未经初始化的全局变量和静态变量。

4、 堆栈段:包含了函数内部声明的局部变量。

当然,上面段的作用不仅于此,具体的作用会在下面的知识点中介绍。

1.1.2 通过代码测试变量的存储位置

Linux下可以通过系统命令“size”查看可以执行程序各个段的大小。但是,可执行程序中的段结构和运行中程序在内存中的段结构并不完全相同,但是有一定的映射关系。具体如下图所示(图片信息来自《C专家编程》):

wps_clip_image-696

下面通过代码示例和“size”来研究变量的存储区域。

test.c

int main()

{

return 1;

}

编译,并且查看可执行程序各个段的大小:

wps_clip_image-779

更改test.c:

int g_data;

int main()

{

return 1;

}

编译,并且查看可执行程序各个段的大小:

wps_clip_image-849

可以发现,文本段,数据段都没有发送变化,而BSS段增加了4个字节。

结论1:未初始化的全局变量保存在BSS段中

继续:

int g_data = 1;

int main()

{

return 1;

}

编译:

wps_clip_image-958

可以发现,BSS段和文本段相同,而数据段增加了4个字节。

结论2:经过初始化的全局变量保存在数据段中

继续:

int main()

{

static int g_data;

return 1;

}

编译:

wps_clip_image-1066

可以发现,文本段,数据段都没有发送变化,而BSS段增加了4个字节。

结论3:未初始化的静态变量保存在BSS段中

继续:

int main()

{

static int g_data = 1;

return 1;

}

编译:

wps_clip_image-1183

可以发现,BSS段和文本段相同,而数据段增加了4个字节。

结论4:经过初始化的静态变量保存在数据段中

继续:

int main()

{

int i_data = 1;

return 1;

}

编译:

wps_clip_image-1288

可以发现,BSS段和和数据段相同,而文本段增加了16个字节。局部变量会在执行的时候在堆栈段中生成,函数执行完毕后释放。

结论5:函数内部声明的局部变量保存在堆栈段中

继续:

const int g_data = 1;

int main()

{

return 1;

}

编译:

wps_clip_image-1430

把全局变量定义为“const”后,也许你会感到奇怪,怎么BSS段和数据段都没有发生变化,而文本段却增加了4个字节。

结论6:const修饰的全局变量保存在文本段中

那么,const的局部变量?

继续:

int main()

{

const int i_data = 1;

return 1;

}

编译:

wps_clip_image-1587

结论7:const修饰的局部变量保存在堆栈段中

继续:

char *pstr = "";

int main()

{

return 1;

}

编译:

wps_clip_image-1666

在做一下更改:

char *pstr = "123456789";

int main()

{

return 1;

}

编译:

wps_clip_image-1733

可以发现,前后数据段和BSS段大小均未发生变化,而文本段增加了9个字节。

结论8:字符串常量保存在文本段中

1.1.3 结论

1、 经过初始化的全局变量和静态变量保存在数据段中。

2、 未经初始化的全局变量和静态变量保存在BSS段。

3、 函数内部声明的局部变量保存在堆栈段中。

4、 const修饰的全局变量保存在文本段中,const修饰的局部变量保存在堆栈段中。

5、 字符串常量保存在文本段中。

1.1.4 扩展阅读

《C专家编程》第6章——详细介绍各个段的作用。

分享到:
评论

相关推荐

    SINUMERIK 840D SL NC变量和接口信号 参数手册V4.8 SP3.pdf

    手册的第27页介绍了NC变量和接口信号的基本概念,为后续深入学习奠定基础。NC(Numerical Control)变量是控制系统中的核心元素,它们存储和传递着机床运行所需的各种数据。接口信号则涉及系统与其他设备之间的通信...

    stm8s ds18b20 代码

    STM8S与DS18B20的交互是嵌入式系统中常见的一种温度测量...通过这个项目,开发者不仅可以学习到STM8S微控制器的使用,还可以深入理解数字温度传感器的原理和1-Wire通信协议,对嵌入式系统的设计和开发有更全面的认识。

    AVR实例教程_ds1302

    下面我们将深入探讨AVR微控制器、DS1302实时时钟以及相关的编程知识。 1. **AVR微控制器**:AVR是一种高级的、低功耗的微控制器系列,由Atmel公司(现已被Microchip Technology收购)开发。AVR采用RISC(精简指令集...

    基于51单片机的DS1302+LCD12864+DS18B20小综合.doc

    7. **数据存储**:变量如`second`、`minute`、`hour`等用于存储时间信息,`temperature`存储DS18B20采集的温度,`DS18B20_H`和`DS18B20_L`用于存储温度的整数和小数部分。 8. **中断和标志位**:`key_flag`用于检测...

    20160822_前11章总结V0.0_13邵温财1

    在深入学习C语言的过程中,了解和熟悉编程环境是至关重要的第一步。TC2.0(Turbo C 2.0)是早期广泛使用的C语言编译器,它提供了两种模式:大模式和小模式。小模式是针对小型程序设计的,程序的代码和数据都在有限的...

    C单片机的程序设计实用PPT课件.pptx

    《C单片机的程序设计实用PPT课件》是针对C单片机编程的一份详细教学资料,主要涵盖了汇编语言的基础知识、程序设计方法以及实际应用示例。以下是对其中关键知识点的详细阐述: 1. **汇编语言指令类型**: - **基本...

    DS18B2051程序

    总的来说,"DS18B2051程序"是一个很好的学习项目,它将帮助初学者掌握温度传感器的使用和单线通信协议,同时提升在KEIL开发环境下的编程技能。通过分析和修改提供的源代码,你可以更好地理解并应用这些知识点。

    ds1302 时钟 PROTUES

    【ds1302 时钟 PROTUES】是一款基于C51编程语言的电子时钟设计,它利用了DS1302这款实时时钟芯片,并结合了PROTUES仿真软件进行...同时,对于学习C51编程和微控制器应用的初学者来说,DS1302时钟是一个很好的实践项目。

    用vtk实现的加载3ds程序-带纹理

    本文将深入探讨如何使用 Visualization Toolkit (vtk) 实现一个加载3DS文件的程序,并添加纹理映射功能。VTK是一个开源的、跨平台的C++库,专门用于科学可视化和图像处理。 在VTK的原始实现中,`vtk3DSImporter`类...

    AVR单片机C语言程序设计实例精粹程序

    AVR单片机C语言程序设计实例精粹程序,正如其标题所示,是针对AVR单片机编程的C语言实践教程,包含了丰富的实例,旨在帮助开发者深入理解和掌握AVR单片机上的C语言编程技巧。 AVR单片机C语言编程的核心知识点包括:...

    51单片机C语言入门共30个内容.

    通过以上30个内容的学习,初学者能够全面掌握51单片机的C语言编程,具备基本的硬件控制能力,并为进一步深入嵌入式系统开发打下坚实基础。每个知识点都配以电路图和相应的C语言程序,有助于理论与实践相结合,提升...

    51单片机DS18B20温度测量制作.doc

    温度值存储在`temperature`变量中,由`tempL`和`tempH`两个8位变量组成。最终,这些温度值通过`display`函数显示在数码管上。 总的来说,这个项目涵盖了单片机基础、数字温度传感器的使用以及相关的软件设计技巧,...

    电子时钟+ds18b20温度计汇编设计

    在电子工程领域,设计一款结合了电子时钟与DS18B20温度计功能的设备是一项实用且有趣的挑战。...这是一份非常有价值的参考资料,对于想要深入学习嵌入式系统和汇编编程的工程师来说,绝对值得收藏和研究。

    DS18B20温度传感器实验.doc

    总结,DS18B20温度传感器实验是一个综合了硬件接口设计、软件编程和数据处理的实践项目。通过这个实验,学习者可以深入理解单线通信协议、嵌入式系统的中断管理以及温度数据的处理方法。实验中的代码展示了如何在...

    MAXScript脚本语言完全学习手册2(png)

    - 《3ds MAXScript脚本语言完全学习手册2》:该手册深入讲解了MAXScript的各个方面,包括基础语法、对象模型、接口编程等内容,适合初学者和进阶者。 - 3ds Max官方文档:3ds Max的官方文档提供了详细的MAXScript...

    CT107D C语言程序2

    【CT107D C语言程序2】是一个与嵌入式系统相关的...通过这个项目,学习者可以深入理解C语言在嵌入式系统中的应用,以及如何与各种传感器和外设进行通信。同时,它也涉及到软件工程中的模块化设计和中断处理等重要概念。

    LCD数字时钟(带详细的C语言编程及protues电路图)

    总结来说,LCD数字时钟项目涵盖了C语言编程、嵌入式系统、微控制器编程、实时时钟芯片DS1302的使用、I2C或SPI通信协议、LCD显示技术以及硬件仿真工具Proteus的应用。这个项目对于学习和提升嵌入式系统开发能力具有很...

    基于PIC的Ds18b20温度采集程序

    本文将深入解析一个基于PIC微控制器的Ds18b20温度采集程序,帮助读者理解如何实现这一功能。 首先,Ds18b20是一款单总线数字温度传感器,它可以通过一根数据线与微控制器进行通信,读取温度数据。在PIC微控制器中,...

    51单片机_DS1302时钟_1602显示_可调时钟 (自动保存的)

    本文将深入探讨51单片机与DS1302实时时钟芯片的集成应用,并结合1602液晶显示器进行时间显示。这一实例基于Proteus仿真平台,便于学习和理解。 DS1302是一款低功耗、高性能的实时时钟芯片,适用于各种嵌入式系统。...

Global site tag (gtag.js) - Google Analytics