请问,静态(全局变量)和栈变量有什么区别吗

请教,静态(全局变量)和栈变量有什么区别吗?
请教,静态(全局变量)和栈变量有什么区别吗?
内存里,静态区/全局区有多大?
谢谢
------解决思路----------------------
你问的这些术语没听说过。而且也和C语言无关。
------解决思路----------------------
静态变量和栈变量的生命周期不同,一个是永生的一个是临时的;他们在内存中的位置不同,一个在静态变量 区,一个是函数执行时调整栈大小来容纳栈变量。静态变量那个区域多大我也没研究过,不懂
------解决思路----------------------
静态区/全局区大小是编译/链接时确定的,你有多少东西, 它就多大, 超过平台限制就不能编译或者运行,
------解决思路----------------------
全局变量理论上大小是不受限制的,但实际上内存空间有限,你不能说弄几个 G 的全局变量出来。如果是带初始化的全局变量,最终是会保存到生成的可执行文件里面的,影响 exe 的大小。

栈的空间是每个线程一个的,创建线程的时候有参数可以指定大小。主线程的大小可以在连接器中设置,默认是 1~2M 左右吧。

------解决思路----------------------
引用:
全局变量理论上大小是不受限制的,但实际上内存空间有限,你不能说弄几个 G 的全局变量出来。如果是带初始化的全局变量,最终是会保存到生成的可执行文件里面的,影响 exe 的大小。

栈的空间是每个线程一个的,创建线程的时候有参数可以指定大小。主线程的大小可以在连接器中设置,默认是 1~2M 左右吧。


“全局变量理论上大小是不受限制”?哪个理论?
标准已经规定,对象的大小不能超过65535个字节,对象包括(但不限于)数组、结构、联合、枚举、指针,等等。也许可以超过,但那未必是安全的。
------解决思路----------------------
全局静态变量的作用域只在本文件内,生存期为变量定义到结束
栈变量的作用域只在函数内,生存期为变量定义到函数结束
------解决思路----------------------
引用:
Quote: 引用:

全局变量理论上大小是不受限制的,但实际上内存空间有限,你不能说弄几个 G 的全局变量出来。如果是带初始化的全局变量,最终是会保存到生成的可执行文件里面的,影响 exe 的大小。

栈的空间是每个线程一个的,创建线程的时候有参数可以指定大小。主线程的大小可以在连接器中设置,默认是 1~2M 左右吧。


“全局变量理论上大小是不受限制”?哪个理论?
标准已经规定,对象的大小不能超过65535个字节,对象包括(但不限于)数组、结构、联合、枚举、指针,等等。也许可以超过,但那未必是安全的。

他说的是所有全局变量的大小,并不指单个
------解决思路----------------------
引用:
Quote: 引用:

Quote: 引用:

全局变量理论上大小是不受限制的,但实际上内存空间有限,你不能说弄几个 G 的全局变量出来。如果是带初始化的全局变量,最终是会保存到生成的可执行文件里面的,影响 exe 的大小。

栈的空间是每个线程一个的,创建线程的时候有参数可以指定大小。主线程的大小可以在连接器中设置,默认是 1~2M 左右吧。


“全局变量理论上大小是不受限制”?哪个理论?
标准已经规定,对象的大小不能超过65535个字节,对象包括(但不限于)数组、结构、联合、枚举、指针,等等。也许可以超过,但那未必是安全的。

请教,怎样指定栈的大小
?


请问,静态(全局变量)和栈变量有什么区别吗

自己创建线程的话:

HANDLE CreateThread(
  LPSECURITY_ATTRIBUTES lpThreadAttributes,
  SIZE_T dwStackSize,
  LPTHREAD_START_ROUTINE lpStartAddress,
  LPVOID lpParameter,
  DWORD dwCreationFlags,
  LPDWORD lpThreadId
);


里面的第二个参数 dwStackSize
------解决思路----------------------
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

Quote: 引用:

全局变量理论上大小是不受限制的,但实际上内存空间有限,你不能说弄几个 G 的全局变量出来。如果是带初始化的全局变量,最终是会保存到生成的可执行文件里面的,影响 exe 的大小。

栈的空间是每个线程一个的,创建线程的时候有参数可以指定大小。主线程的大小可以在连接器中设置,默认是 1~2M 左右吧。


“全局变量理论上大小是不受限制”?哪个理论?
标准已经规定,对象的大小不能超过65535个字节,对象包括(但不限于)数组、结构、联合、枚举、指针,等等。也许可以超过,但那未必是安全的。

请教,怎样指定栈的大小
?


请问,静态(全局变量)和栈变量有什么区别吗

自己创建线程的话:

HANDLE CreateThread(
  LPSECURITY_ATTRIBUTES lpThreadAttributes,
  SIZE_T dwStackSize,
  LPTHREAD_START_ROUTINE lpStartAddress,
  LPVOID lpParameter,
  DWORD dwCreationFlags,
  LPDWORD lpThreadId
);


里面的第二个参数 dwStackSize

多谢,如果要指定栈的大小,必须自己创建线程吗?

不是啊,主线程栈的大小就在截图那里设置

新线程是你有需要才创建,创建的时候可以指定大小。
------解决思路----------------------
请问,静态(全局变量)和栈变量有什么区别吗理解讨论之前请先学会如何观察

VMMap 是进程虚拟和物理内存分析实用工具。http://technet.microsoft.com/zh-cn/sysinternals/dd535533

------解决思路----------------------
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……

VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。