在Linux上,我有一段代码,在主函数内声明了一个大小为2MB+1字节的数组。
#include <stdio.h>
#include <stdlib.h>
#define MAX_DATA (2097152) /* 2MB */
int main(int argc, char *argv[])
{
/* Reserve 1 byte for null termination */
char data[MAX_DATA + 1];
printf("Bye\n");
return 0;
}
当我在Linux上使用gcc编译时,可以无问题地运行。但是在Windows上,我遇到了运行时错误。在运行时,我有5GB的空闲内存。
为了解决Windows上的问题,我需要指定其他堆栈大小:
gcc -Wl,--stack,2097153 -o test.exe test.c
或者在主函数之外声明数据数组。
是因为在Linux上编译的程序链接时未更改堆栈大小吗?
为什么它在Linux上运行良好,但在Windows上失败? 我使用相同的源代码和相同的gcc指令:
gcc -Wall -O source.c -o source
因为 Linux 上的 malloc 实现可能不可靠,即使内存不可用也可以返回非空指针。
我认为在运行在 Linux 上的程序中,它可能会默默地忽略堆栈问题?
可能是因为在 Linux 上运行的程序没有链接更改堆栈大小,但不像 Windows 那样在运行时失败,而是默默地忽略了堆栈问题?
此外,为什么如果我将数组声明在主函数之外,在 Windows 上它可以正常工作?如果它使用堆,则为什么我不需要释放它?
SIGSEGV
吗? - devnullstatic
添加到数组的声明中。 - Harry Johnston