在另一个函数中使用strcat:分段错误(核心转储)

时间:2016-11-25 10:34:59

标签: c function fault strcat

{{1}}

编译器说分段错误(核心转储) 这里的实际问题是什么?

5 个答案:

答案 0 :(得分:6)

您有未定义的行为。您不能修改字符串文字cmd指向字符串文字并且strcat()尝试连接到它,这就是问题。

  int main(void)
    {
        char arr[256] = "test";
        foo(arr);
        return 0;
    }

在C中使用strcpy()strcat()等时,您通常需要小心,因为您可能会溢出缓冲区。 在我的例子中,我使用的数组大小为256,这对你的例子来说已经足够了。但是如果你要连接一些未知大小的东西,你需要小心。

答案 1 :(得分:2)

您正尝试将某些内容附加到无法修改的字符串文字test。这是未定义的行为。

你想要这个:

static void foo(unsigned char *cmd)
{
    strcat(cmd, "\r\n");
    printf("\r\nfoo: #%s#", cmd);
}

int main()
{
    char test[50] = "test";
    foo(test);
    printf("test after calling foo: %s\n", test);
    return 0;
}

答案 2 :(得分:2)

在C字符串文字中(如"test")是只读字符数组。由于它们是只读的,因此无法修改。由于它们是阵列,因此它们具有固定的大小。你们都试图修改字符串文字并扩展它。

答案 3 :(得分:1)

其他人已经解释了为什么你不能做到这一点。 你基本上有两个选择:

  • 您可以修改字符串(使用realloc()以允许添加后缀("\r\n")。但是您必须小心并使用malloc分配的数据。
  • 否则,分配一个输入大小的新字符串,加上后缀的大小,并复制输入字符串和前缀,然后返回。在这种情况下,调用者需要free()返回的字符串(可能还有传递给函数的字符串,但是这也可以处理)。

编辑:如果使用静态分配的缓冲区,则可能需要在函数中添加一个额外的参数,以指示可用缓冲区的大小。

答案 4 :(得分:0)

与我合作改变了程序,如:

static void foo(unsigned char *cmd)
{
    unsigned char local[10];
    strcpy(local, cmd);
    strcat(local, "\r\n");
    printf("\r\nfoo: #%s#", local);

}
int main()
{
    foo("test");
    return 0;
}