易截截图软件、单文件、免安装、纯绿色、仅160KB

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专家编程》):

下面通过代码示例和“size”来研究变量的存储区域。
test.c
int main()
{
return 1;
}
编译,并且查看可执行程序各个段的大小:

更改test.c:
int g_data;
int main()
{
return 1;
}
编译,并且查看可执行程序各个段的大小:

可以发现,文本段,数据段都没有发送变化,而BSS段增加了4个字节。
结论1:未初始化的全局变量保存在BSS段中
继续:
int g_data = 1;
int main()
{
return 1;
}
编译:

可以发现,BSS段和文本段相同,而数据段增加了4个字节。
结论2:经过初始化的全局变量保存在数据段中
继续:
int main()
{
static int g_data;
return 1;
}
编译:

可以发�


相关文档:

C和C++程序员学习历程

很有参考意义的学历流程。
  1、可以考虑先学习C.

  大多数时候,我们学习语言的目的,不是为了成为一个语言专家,而是希望成为一个解决问题的专家。做一个有用的程序员,做一个赚钱的程序员。我们的价值,将体现在客户价值上,而不是语言写得好不好看。


  C++是C的一个面向对象的解释,C++为C� ......

50个c/c++源代码网站

C/C++是最主要的编程语言。这里列出了50名优秀网站和网页清单,这些网站提供c/c++源代码 。这份清单提供了源代码的链接以及它们的小说明。我已尽力包括最佳的C/C++源代码的网站。这不是一个完整的清单,您有建议可以联系我,我将欢迎您的建 议,以进一步加强这方面的清单。 
1、http://snippets.dzone.com/tag/c/&nbs ......

由atof发现的C中浮点小数不精确问题


比如 输入1.9会显示1.899999 类似的问题
 
由于C语言中对于浮点小数的表达方式的局限导致的。C语言中10进制小数是直接用2进制小数来表示的。由于某些10进制小数根本无法用2进制小数来精确表达,譬如0.1,导致计算机不得不用近似的相差很小的2进制小数来表示这些10进制小数。   
  既然是近似,就一 ......

extern "C"

如果C++调用一个C语言编写的.DLL时,当包括.DLL的头文件或声明接口函数时,应加extern "C" { }。
如:
头文件cExample.h
#include <stdio.h>
#ifndef C_EXAMPLE_H
#define C_EXAMPLE_H
int add(int x,int y);
#endif

函数实现文件cExample.c(注意是.c文件)
#include<stdio.h>
#include "cExample ......

C ++的单例模式


单例模式:对应一个类只能生成一个对象。
#include <stdio.h>
class A
{
 private:
  int id;
  A() {}//把构造函数放在private:下目的是在类外不能在栈上直接分配空间定义对象。
 public:
  static A *pt;
  static A *instance()
   ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号