1、未始化的全局变量
代码:
int szTestData[1024 * 1024 * 1024] = {0};
int main()
{
// int* piTestData = new int[1024 * 1024 * 1024];
return 0;
}
结果:
可以编译通过
但是运行结果为
Segmentation fault (core dumped)
2、初始化全局变量
代码:
int szTestData[1024 * 1024 * 1024] = {1};
int main()
{
// int* piTestData = new int[1024 * 1024 * 1024];
return 0;
}
结果:
/usr/bin/ld: final link failed: Memory exhausted
collect2: error: ld returned 1 exit status
3、栈变量
其实可以不用看,栈变量肯定是不能超大的。
代码
#include
using namespace std;
int fun(void) {
int szTestData[1024 * 1024 * 1024] = {1};
return 0;
}
int main()
{
// int* piTestData = new int[1024 * 1024 * 1024];
fun();
return 0;
}
结果和未初始化全局变量一致。
4、堆变量
代码:
#include
using namespace std;
int main()
{
int* piTestData = new int[1024 * 1024 * 1024];
// fun();
return 0;
}
结果:
可以编译过
运行结果为
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
Aborted (core dumped)
分析:
程序个数据段分布图如下:
1、未初始化全局变量bss段
在程序装入内核空间的的时候,就已经发现bss段占用了heap了。所以编译通过,执行core。
2、初始化全局变量
在链接的时候发现数据段太大了。编译失败
3、栈变量
运行时分配,跑到对于函数后分配内存的时候栈区溢出
4、堆变量。
内核分配内存失败,给程序抛出一个异常。