我想追加一个空格到我的字符的末尾,这是我刚刚测试的代码,它抛回了一个Bus Error
;追加字符到字符末尾
int main() {
char* test = "Test";
printf("%s\n", test);
strcat(test, "a");
printf("%s\n", test);
return 0;
}
我想追加一个空格到我的字符的末尾,这是我刚刚测试的代码,它抛回了一个Bus Error
;追加字符到字符末尾
int main() {
char* test = "Test";
printf("%s\n", test);
strcat(test, "a");
printf("%s\n", test);
return 0;
}
这里的主要问题是test
指向一个文字字符串,并且文字字符串是常量,因此是只读的。试图更改文字字符串是未定义的行为。
如果要将字符附加到一个字符串,则必须先分配它。将堆上的堆(例如malloc
)作为数组放在堆栈上。分配的内存必须足够大才能容纳额外的字符,在您的情况下,它必须至少包含六个字符:字符串四个,字符'a'
一个,以及一个用于终止所有字符串的特殊字符。
感谢您的解释,我用-gall和gcc编译了它,它从不向我发出警告或错误。 – user2593573
你有一个引用字符串文字是'const char *'类型吗? C11 6.7.9.32说“'char * p =”abc“;'用''char'类型的指针定义'p',并初始化它以指向一个'char'数组类型的对象。 –
@PaulGriffiths从6.4.5/7节开始:“如果程序试图修改这样一个数组,则行为是不确定的。”虽然它没有明确指出字符串文字是“const char *”(或者更确切地说是“const char []”),但由于它们不能被修改,所以它们在所有实际中都是这种类型。 –
是一个字符串文字,你不允许修改它。如果你改变:
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更严格。
int main() {
char* test = malloc(NUMBER_OF_BYTES);
strcpy(test,"Test");
printf("%s\n", test);
strcat(test, "a");
printf("%s\n", test);
return 0;
}
启用您的编译器警告也许? –
该程序编译得很好,这是一个运行时错误。 – user2593573
不,这是一个代码错误。你应该得到一个足够聪明的编译器来告诉你。 –