user-0 提问: 请教，静态(全局变量)和栈变量有什么区别吗？

回复:
user: user-1
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。

user: user-1
content: 理解和讨论之前请先学会如何观察！  VMMap 是进程虚拟和物理内存分析实用工具。http://technet.microsoft.com/zh-cn/sysinternals/dd535533

user: user-2
content: 引用 10 楼 startstop2015 的回复:[quote=引用 9 楼 adlay 的回复:] [quote=引用 6 楼 startstop2015 的回复:] [quote=引用 5 楼 sholber 的回复:] [quote=引用 4 楼 adlay 的回复:] 全局变量理论上大小是不受限制的，但实际上内存空间有限，你不能说弄几个 G 的全局变量出来。如果是带初始化的全局变量，最终是会保存到生成的可执行文件里面的，影响 exe 的大小。  栈的空间是每个线程一个的，创建线程的时候有参数可以指定大小。主线程的大小可以在连接器中设置，默认是 1~2M 左右吧。  “全局变量理论上大小是不受限制”？哪个理论？ 标准已经规定，对象的大小不能超过65535个字节，对象包括（但不限于）数组、结构、联合、枚举、指针，等等。也许可以超过，但那未必是安全的。[/quote] 请教，怎样指定栈的大小 ?[/quote]    自己创建线程的话：  HANDLE CreateThread(   LPSECURITY_ATTRIBUTES lpThreadAttributes,   SIZE_T dwStackSize,   LPTHREAD_START_ROUTINE lpStartAddress,   LPVOID lpParameter,   DWORD dwCreationFlags,   LPDWORD lpThreadId );   里面的第二个参数 dwStackSize[/quote] 多谢，如果要指定栈的大小，必须自己创建线程吗？[/quote] 不是啊，主线程栈的大小就在截图那里设置  新线程是你有需要才创建，创建的时候可以指定大小。

user: user-0
content: 引用 9 楼 adlay 的回复:[quote=引用 6 楼 startstop2015 的回复:] [quote=引用 5 楼 sholber 的回复:] [quote=引用 4 楼 adlay 的回复:] 全局变量理论上大小是不受限制的，但实际上内存空间有限，你不能说弄几个 G 的全局变量出来。如果是带初始化的全局变量，最终是会保存到生成的可执行文件里面的，影响 exe 的大小。  栈的空间是每个线程一个的，创建线程的时候有参数可以指定大小。主线程的大小可以在连接器中设置，默认是 1~2M 左右吧。  “全局变量理论上大小是不受限制”？哪个理论？ 标准已经规定，对象的大小不能超过65535个字节，对象包括（但不限于）数组、结构、联合、枚举、指针，等等。也许可以超过，但那未必是安全的。[/quote] 请教，怎样指定栈的大小 ?[/quote]    自己创建线程的话：  HANDLE CreateThread(   LPSECURITY_ATTRIBUTES lpThreadAttributes,   SIZE_T dwStackSize,   LPTHREAD_START_ROUTINE lpStartAddress,   LPVOID lpParameter,   DWORD dwCreationFlags,   LPDWORD lpThreadId );   里面的第二个参数 dwStackSize[/quote] 多谢，如果要指定栈的大小，必须自己创建线程吗？

user: user-2
content: 引用 6 楼 startstop2015 的回复:[quote=引用 5 楼 sholber 的回复:] [quote=引用 4 楼 adlay 的回复:] 全局变量理论上大小是不受限制的，但实际上内存空间有限，你不能说弄几个 G 的全局变量出来。如果是带初始化的全局变量，最终是会保存到生成的可执行文件里面的，影响 exe 的大小。  栈的空间是每个线程一个的，创建线程的时候有参数可以指定大小。主线程的大小可以在连接器中设置，默认是 1~2M 左右吧。  “全局变量理论上大小是不受限制”？哪个理论？ 标准已经规定，对象的大小不能超过65535个字节，对象包括（但不限于）数组、结构、联合、枚举、指针，等等。也许可以超过，但那未必是安全的。[/quote] 请教，怎样指定栈的大小 ?[/quote]    自己创建线程的话：  HANDLE CreateThread(   LPSECURITY_ATTRIBUTES lpThreadAttributes,   SIZE_T dwStackSize,   LPTHREAD_START_ROUTINE lpStartAddress,   LPVOID lpParameter,   DWORD dwCreationFlags,   LPDWORD lpThreadId );   里面的第二个参数 dwStackSize

user: user-3
content: 引用 5 楼 sholber 的回复:[quote=引用 4 楼 adlay 的回复:] 全局变量理论上大小是不受限制的，但实际上内存空间有限，你不能说弄几个 G 的全局变量出来。如果是带初始化的全局变量，最终是会保存到生成的可执行文件里面的，影响 exe 的大小。  栈的空间是每个线程一个的，创建线程的时候有参数可以指定大小。主线程的大小可以在连接器中设置，默认是 1~2M 左右吧。  “全局变量理论上大小是不受限制”？哪个理论？ 标准已经规定，对象的大小不能超过65535个字节，对象包括（但不限于）数组、结构、联合、枚举、指针，等等。也许可以超过，但那未必是安全的。[/quote] 他说的是所有全局变量的大小，并不指单个

user: user-4
content: 全局静态变量的作用域只在本文件内，生存期为变量定义到结束 栈变量的作用域只在函数内，生存期为变量定义到函数结束

user: user-0
content: 引用 5 楼 sholber 的回复:[quote=引用 4 楼 adlay 的回复:] 全局变量理论上大小是不受限制的，但实际上内存空间有限，你不能说弄几个 G 的全局变量出来。如果是带初始化的全局变量，最终是会保存到生成的可执行文件里面的，影响 exe 的大小。  栈的空间是每个线程一个的，创建线程的时候有参数可以指定大小。主线程的大小可以在连接器中设置，默认是 1~2M 左右吧。  “全局变量理论上大小是不受限制”？哪个理论？ 标准已经规定，对象的大小不能超过65535个字节，对象包括（但不限于）数组、结构、联合、枚举、指针，等等。也许可以超过，但那未必是安全的。[/quote] 请教，怎样指定栈的大小 ?

user: user-5
content: 引用 4 楼 adlay 的回复:全局变量理论上大小是不受限制的，但实际上内存空间有限，你不能说弄几个 G 的全局变量出来。如果是带初始化的全局变量，最终是会保存到生成的可执行文件里面的，影响 exe 的大小。  栈的空间是每个线程一个的，创建线程的时候有参数可以指定大小。主线程的大小可以在连接器中设置，默认是 1~2M 左右吧。  “全局变量理论上大小是不受限制”？哪个理论？ 标准已经规定，对象的大小不能超过65535个字节，对象包括（但不限于）数组、结构、联合、枚举、指针，等等。也许可以超过，但那未必是安全的。

user: user-2
content: 全局变量理论上大小是不受限制的，但实际上内存空间有限，你不能说弄几个 G 的全局变量出来。如果是带初始化的全局变量，最终是会保存到生成的可执行文件里面的，影响 exe 的大小。  栈的空间是每个线程一个的，创建线程的时候有参数可以指定大小。主线程的大小可以在连接器中设置，默认是 1~2M 左右吧。

user: user-6
content: 静态区/全局区大小是编译/链接时确定的，你有多少东西, 它就多大, 超过平台限制就不能编译或者运行,

user: user-7
content: 静态变量和栈变量的生命周期不同，一个是永生的一个是临时的；他们在内存中的位置不同，一个在静态变量 区，一个是函数执行时调整栈大小来容纳栈变量。静态变量那个区域多大我也没研究过，不懂

user: user-5
content: 你问的这些术语没听说过。而且也和C语言无关。