yao*_*bin 8 c linux stack-overflow callstack
我有两个简单的C++程序和两个问题.我在CentOS 5.2工作,我的开发环境如下:
计划#1:
main.cpp中:
int main(int argc, char * argv[])
{
char buf[1024*1024*11] = {0};
return 0;
}
Run Code Online (Sandbox Code Playgroud)
(用"g ++ -g main.cpp"编译)
程序在堆栈上分配1024*1024*11字节(即11MB),但不会崩溃.将分配大小更改为1024*1024*12(即12MB)后,程序崩溃.我认为这应该是由堆栈溢出引起的. 但是为什么程序在分配大小为11MB时不会崩溃,这也大于10MB的上限?
计划#2:
main.cpp中:
#include <iostream>
int main(int argc, char * argv[])
{
char buf[1024*1024*11] = {0};
std::cout << "*** separation ***" << std::endl;
char buf2[1024*1024] = {0};
return 0;
}
Run Code Online (Sandbox Code Playgroud)
(用"g ++ -g main.cpp"编译)
该程序将导致程序崩溃,因为它在堆栈上分配12MB字节.但是,根据核心转储文件(见下文),崩溃发生在buf但不是buf2. 不应该崩溃发生在buf2上,因为我们从程序#1知道char buf [1024*1024*11]的分配是正常的,因此在我们分配另一个1024*1024字节后,堆栈会溢出吗?
我认为必须有一些非常基本的概念,我没有建立一个坚实的理解.但是他们是什么?
附录:程序#2生成的核心转储信息:
Core was generated by `./a.out'.
Program terminated with signal 11, Segmentation fault.
[New process 16433]
#0 0x08048715 in main () at main.cpp:5
5 char buf[1024*1024*11] = {0};
Run Code Online (Sandbox Code Playgroud)
您错误地认为堆栈分配发生在代码中.只要有编译时已知大小的局部变量,就会在输入函数时将它们的空间分配在一起.稍后仅分配动态大小的局部变量(VLA和alloca).
此外,只要您写入内存,就会发生错误,而不是在第一次分配时发生.很可能buf位于堆栈上的buf2之前,溢出因此发生在buf中,而不是buf2.
在堆栈上定义局部变量时,没有像在堆中那样真正分配内存。堆栈内存分配更简单地包括更改堆栈指针的地址(将由被调用函数使用)以保留所需的内存。
我怀疑更改堆栈指针的操作仅在函数开头执行一次,以便为所有使用的局部变量保留空间(反对每个局部变量更改一次)。这解释了为什么程序 #2 的错误在第一次分配时发生。
| 归档时间: |
|
| 查看次数: |
582 次 |
| 最近记录: |