C:字符串限制?没有编译器 err/warn- 为什么?

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

我正在编写一些 mqtt 的代码。有效 mqtt 消息的最大消息大小为 268435455 bytes approx 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 错误,但不是段错误。

谁能给我解释一下?

谢谢

/KNEBB

您正在为堆栈上的字符数组分配 space。

编译器通常不知道为堆栈提供了多少内存。这毫无意义,因为他们不知道最终程序的其他模块可能使用多少堆栈。如果递归起作用,使用的堆栈 space 可能无法确定。

链接器也做不到。

目标的 ABI 定义堆栈的大小。

常见目标的堆栈从几十个字节(微控制器)到几兆字节(PC)。

所以你没有达到语言的极限,而是你的目标。

通过将所需的 space 分配给 malloc() 来解决您的问题。