[英]Stack overflow silenced on linux?
在Linux上我有一個代碼,它使用在main函數內聲明的數組,其中6e為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;
}
當我使用gcc在Linux上編譯時,我運行它沒有任何問題。 但是在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上正常工作? 萬一它使用堆為什么我不需要免費呢?
為什么它在Linux上運行良好但在Windows上運行失敗?
因為進程或線程的默認堆棧大小取決於系統:
ulimit
命令配置最大堆棧大小。 此外,您可以在創建新線程時配置堆棧大小。 因為linux上的malloc實現我認為不可靠,因為它可以返回非空指針,即使內存不可用。
我想你在談論過度使用問題 。 要解決此問題,您可以使用calloc
並檢查返回值。 如果在應用程序的最開始執行此操作,則可以立即退出並顯示相應的錯誤消息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.