【问题标题】:segfault when concating two strings in small array在小数组中连接两个字符串时出现段错误
【发布时间】:2013-08-21 08:19:12
【问题描述】:

我昨天开始学习C,所以这可能是一个微不足道的问题,但我还是不明白。

假设我有以下代码:

#include <stdio.h>
#include <string.h>

int main()
{
    char text[8];
    strcpy(text, "Lorem ");
    puts(text);
    strcat(text, "ipsum!");
    puts(text);
    return 0;
}

这将在连接字符串时(或之后)导致分段错误。但是,如果我将 text 的大小从 8 更改为 9,则不会。

如果我错了,请纠正我,但这是我认为正确的:

“Lorem” - 大小 6(或带有 \0 的 7)
“伊普苏姆!” - 6 号(或带有 \0 的 7 号)
“Lorem ipsum!” - 12 号(或 13 号带 \0)

那么,8/9 来自哪里?这是strcat的执行造成的吗?还是有类似最小数组长度的东西?还是我犯了一个愚蠢的初学者错误?

提前致谢。

【问题讨论】:

  • 在 Valgrind (valgrind.org) 下运行这个,你会发现两种情况都有问题。
  • 对于您的问题“8/9 来自哪里”的答案,您的特定编译器完全有可能以 8 个字节的块分配内存。所以 text[8] 将分配 8 个字节; text[9] 将四舍五入到 16 个字节。当然这是依赖于实现的,你不应该指望编译器总是这样做!

标签: c segmentation-fault strcat


【解决方案1】:

它没有崩溃只是纯粹的运气,至少在 Linux 上我得到了*** stack smashing detected ***

您正在尝试将一个字符串附加到另一个字符串,即使后者的存储空间不足。这是未定义行为的一个示例(如 cmets 中所指出的)。

C 是一种始终信任程序员的语言,因此在编译时您甚至可能不会收到警告。

始终确保缓冲区中有足够的存储空间,C 语言中很少有工具可以保证安全行为,因此不要假设 minimum array length 之类的东西。

【讨论】:

  • 嗯,我认为这是我应该习惯的,因为我只有 Java 和一些脚本语言的经验。谢谢。
  • 哦,当然,Java 非常特殊,例如永远不会让您使用未初始化的原始类型,而如果您启用了所有警告,您可能会在 C 中收到警告,假设您知道自己在做什么,它仍然可以让您运行代码:) 而且您永远不会得到脚本语言的宽容行为,这些语言在幕后为您做了很多事情。 C 非常简单。
【解决方案2】:

当您超出数组的末尾时,程序会出现未定义的行为。这意味着它可能会做你期望它做的事情,也可能不会。它可能会像您没有调用未定义的行为一样运行。它可能会崩溃。它可能会重新格式化您的硬盘驱动器。它可能会在您的打印机上打印空白页。它可能会执行所有这些操作,具体取决于您何时运行它。

你不知道。这就是“未定义的行为”。未定义。

我可以给你一个行为的解释,但它没有帮助,而且非常具体的硬件和实现。

【讨论】:

    【解决方案3】:

    你可以 malloc 到你想要的任何大小。甚至您也可以根据进一步的输入重新分配。

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    int main()
    {
        char *text;
        text = (char *) malloc(sizeof(char) * 12);
        memset(text, 0x0, sizeof(char) * 12);
        sprintf(text, "%s", "Lorem ");
        puts(text);
        sprintf(text, "%s%s", text, "ipsum!");
        puts(text);
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-21
      • 1970-01-01
      • 1970-01-01
      • 2020-10-11
      • 2020-08-18
      • 2012-10-05
      • 2020-01-19
      • 1970-01-01
      相关资源
      最近更新 更多