gpt4 book ai didi

c - 动态分配的 C 字符串存储超过指定的容量

转载 作者:太空宇宙 更新时间:2023-11-04 08:36:31 26 4
gpt4 key购买 nike

我有以下代码。它接受从 1 到 52 的卡的任何值。

char* formatCard( int card )
{
char suit[4][4] = {"♠", "♥", "♣", "♦"};
char number[13][6] = {"2", "3", "4", "5", "6", "7",
"8", "9", "10", "Jack", "Queen", "King", "Ace"};

char* s = malloc(1);
sprintf(s, "%s of %s", number[card%13], suit[card/13]);
return s;
}

代码工作正常,但是当我动态分配 c 字符串时 char* s = malloc(1); 它可以占用任意数量的内存,无论它有多小并且尽管 c 弦的最大尺寸可以达到 10(如果您认为花色符号的尺寸为 3,则为 12 ...理解并困惑我)。

谁能解释一下我觉得很奇怪的事情?这可能只发生在我的电脑/操作系统上吗?我目前正在使用 Ubuntu。

最佳答案

你的程序是错误的,你知道这一点。但是编译器不知道,所以程序仍然运行。给了什么?

char* s = malloc(1);
sprintf(s, "%s of %s", number[card%13], suit[card/13]);

这会调用称为“未定义行为”的东西。这意味着你的程序是错误的,它会做一些意想不到的事情。也许会死机,也许不会死机,也许会写错答案,也许会格式化你的硬盘。

在这种情况下,sprintf() 可能会超出您分配的缓冲区的末尾,写入内存的其他部分。当发生这种情况时,有时内存不会被映射,从而导致段错误(崩溃)。有时内存会被用于其他用途,而程序的其他部分会出现异常。当损坏的内存被程序的其他部分使用时,程序稍后可能会崩溃。

修复

您想改用 snprintf()snprintf() 函数接受第二个参数,即缓冲区的大小。 snprintf() 函数更安全,因为它会在到达缓冲区末尾时停止写入数据。

size_t sz = 1;
char *s = malloc(sz);
snprintf(s, sz, "%s of %s", number[card % 13], suit[card / 13]);

如果您使用的是最新的 Clang 或 GCC,您也可以尝试使用地址清理器。

关于c - 动态分配的 C 字符串存储超过指定的容量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26022411/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com