{{1}}
编译器说分段错误(核心转储) 这里的实际问题是什么?
答案 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;
}