簡體   English   中英

C:字符串限制? 沒有編譯器錯誤/警告 - 為什么?

[英]C: string limit? No compiler err/warn- why?

我正在編寫一些 mqtt 的東西。 有效 mqtt 消息的最大消息大小為268435455 字節,大約 260MB

現在我在我的代碼中遇到了幾個段錯誤並且它失敗了我不能在 C 中使用這種大小的*char (Rasbian/Debian 9: Linux zentrale 5.10.103-v7+ #1529 SMP Tue Mar 8 12:21:37 GMT 2022 armv7l GNU/Linux )。

出於測試目的,我編寫了以下示例程序:

#include <stdio.h> 
#include <string.h>
#define MAX_STRING 268435456 

int main()
{
int i;

void function()
{
        char    message[MAX_STRING];

        printf("0\n");
        memset(message,0,sizeof(message));
        printf("1\n");
        return;
}

i=1;
printf("i: %d\n",i);
i++;
printf("i: %d\n",i);
function();
printf("i: %d\n",i);
}

我可以在沒有任何警告或錯誤的情況下編譯它。 運行時,我得到以下輸出:

root@rasbpi:/src# ./Beispiel 
i: 1
i: 2
Segmentation fault

(德語原文:Speicherzugriffsfehler)

我不明白為什么我會收到段錯誤。 如果尺寸太大,編譯器不應該抱怨嗎? 如果沒有限制並且系統內存不足(它不是!)我應該得到 OOM 錯誤,但不是段錯誤。

有誰能給我解釋一下嗎?

謝謝

/克尼布

您正在為堆棧上的字符數組分配空間。

編譯器通常不知道為堆棧提供了多少內存。 這是沒有意義的,因為他們不知道最終程序的其他模塊可能使用多少堆棧。 如果遞歸發揮作用,使用的堆棧空間可能無法確定。

鏈接器也不能這樣做。

目標的 ABI 定義了堆棧的大小。

常見目標具有從幾十字節(微控制器)到幾兆字節(PC)的堆棧。

所以你沒有達到語言的限制,而是你的目標。

通過使用malloc()分配所需的空間來解決您的問題。

暫無
暫無

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

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