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()
来解决您的问题。
我正在编写一些 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()
来解决您的问题。