簡體   English   中英

堆棧溢出在Linux上沉默?

[英]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上運行失敗?

因為進程或線程的默認堆棧大小取決於系統:

因為linux上的malloc實現我認為不可靠,因為它可以返回非空指針,即使內存不可用。

我想你在談論過度使用問題 要解決此問題,您可以使用calloc並檢查返回值。 如果在應用程序的最開始執行此操作,則可以立即退出並顯示相應的錯誤消息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM