1

我正在尝试在我的字符末尾附加一个空格,这是我正在测试的代码,它会返回一个Bus Error;

int main() {
    char* test = "Test";
    printf("%s\n", test);
    strcat(test, "a");
    printf("%s\n", test);
    return 0;
}
4

3 回答 3

5

"Test"是一个字符串文字,你不能修改它。如果你改变:

char * test = "Test";

到:

char test[10] = "Test";

它会按您的预期工作。

编辑:在评论中有一些关于这是否应该导致编译器警告的讨论。在 C 中,char * test = "Test";格式完全正确,不应导致任何警告。在任何理智的实现中,strcat()都会提前很长时间编译,所以它不能给你任何警告,并且因为它期望 achar *作为它的第一个参数,这就是你传递它的内容,所以也不应该导致警告. 您可能有一个非常聪明的编译器,它既记得您指向test一个字符串文字并且从那以后没有将它指向其他任何东西,并且知道这strcat()会改变它,但这似乎不太可能,所以我怀疑你会在这里收到任何警告。它'

我相信 C++ 中的情况有所不同。编译它g++ -std=c++11会给我一个deprecated conversion from string constant to 'char *'警告,您可以通过更改为来消除它,const char * test = "Test";然后当您尝试传递 a const char *to时会给您一个新错误strcat(),它需要一个 plain char *。C++ 类型检查比 C 更严格。

于 2013-10-05T18:48:44.297 回答
3

这里的主要问题是test指向文字字符串,文字字符串是常量,因此是只读的。尝试更改文字字符串是未定义的行为

如果要将字符附加到字符串,则必须先分配它。在堆栈上的堆上(使用 eg malloc)作为数组。分配的内存还必须足够大以能够容纳额外的字符,在您的情况下,它必须至少有六个字符:四个用于 string "Test",一个用于字符'a',一个用于终止所有字符串的特殊字符。

于 2013-10-05T18:48:56.157 回答
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;
 }
于 2013-10-05T18:51:41.543 回答