[英]Why doesn't my C compiler warn when I assign a string literal to a non-const pointer?
[英]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.