我正在尝试在我的char的末尾附加一个空格,这是我正在测试的代码,它会抛出Bus Error
;
int main() {
char* test = "Test";
printf("%s\n", test);
strcat(test, "a");
printf("%s\n", test);
return 0;
}
答案 0 :(得分:6)
"Test"
是字符串文字,不允许您修改它。如果你改变:
char * test = "Test";
为:
char test[10] = "Test";
它会像你期望的那样工作。
编辑:在评论中,有一些关于这是否应该导致编译器警告的讨论。在C中,char * test = "Test";
格式完美,不应导致任何警告。在任何理智的实现中,strcat()
将在很长一段时间内被编译,因此它不会给你任何警告,因为它期望char *
作为它的第一个参数,这就是你传递它的内容,这不应该导致警告。有可能你有一个非常聪明的编译器,它记得你将test
指向一个字符串文字并且没有指向其他任何东西,因为和知道{{1}它会改变它,但这似乎不太可能,所以我怀疑你在这里得到任何警告。这是你必须要知道和避免的事情之一。
我相信C ++的情况有所不同。使用strcat()
进行编译会给我一个g++ -std=c++11
警告,您可以通过更改为deprecated conversion from string constant to 'char *'
来消除此问题。当您尝试将const char * test = "Test";
传递给const char *
时,会出现新错误strcat()
,期望普通char *
。 C ++类型检查比使用C更严格。
答案 1 :(得分:4)
这里的主要问题是test
指向文字字符串,文字字符串是常量,因此是只读的。尝试更改文字字符串是未定义的行为。
如果要将字符附加到字符串,则必须先将其分配。在堆上(例如malloc
)在堆栈上作为数组。分配的内存也必须足够大才能容纳额外的字符,在你的情况下它必须至少有六个字符:四个用于字符串"Test"
,一个用于字符'a'
和一个对于终止所有字符串的特殊字符。
答案 2 :(得分:0)
int main() {
char* test = malloc(NUMBER_OF_BYTES);
strcpy(test,"Test");
printf("%s\n", test);
strcat(test, "a");
printf("%s\n", test);
return 0;
}