2013-10-05 148 views
1

我想追加一个空格到我的字符的末尾,这是我刚刚测试的代码,它抛回了一个Bus Error;追加字符到字符末尾

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

启用您的编译器警告也许? –

+0

该程序编译得很好,这是一个运行时错误。 – user2593573

+2

不,这是一个代码错误。你应该得到一个足够聪明的编译器来告诉你。 –

回答

4

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

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

+0

感谢您的解释,我用-gall和gcc编译了它,它从不向我发出警告或错误。 – user2593573

+0

你有一个引用字符串文字是'const char *'类型吗? C11 6.7.9.32说“'char * p =”abc“;'用''char'类型的指针定义'p',并初始化它以指向一个'char'数组类型的对象。 –

+0

@PaulGriffiths从6.4.5/7节开始:“如果程序试图修改这样一个数组,则行为是不确定的。”虽然它没有明确指出字符串文字是“const char *”(或者更确切地说是“const char []”),但由于它们不能被修改,所以它们在所有实际中都是这种类型。 –

6

​​是一个字符串文字,你不允许修改它。如果你改变:

char * test = "Test"; 

到:

char test[10] = "Test"; 

,你指望它它会工作。

编辑:有一些讨论是否应该在注释中导致编译器警告。在C中,char * test = "Test";完美结构良好,不应导致任何警告。在任何理智的实现中,strcat()将事先编译很久,所以它不会给你任何警告,并且因为它期望char *作为它的第一个参数,并且这就是你传递它的值,所以不应该导致警告,要么。有可能你可以有一个非常聪明的编译器,它们都记得你指出test为字符串字面值,并且没有指出任何其他值,因为知道strcat()将会改变它,但这看起来不太可能,所以我怀疑你会在这里得到任何警告。这是你必须知道和避免的事情之一。

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

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; 
} 
相关问题