将一个字符串字面值赋值给char*。

15

5
不要使用 C++ 编译器来编译 C 代码。 - pmg
5
你真的应该使用 const char * 来实现这个。 - Oliver Charlesworth
2
那些其他原因是什么? - Marcelo Cantos
2
忽略警告是一个非常糟糕的想法。只需使用 char const*pc1,一切都应该没问题。 - Jens Gustedt
1
你可能不想使用 const char*,但是那个字符串字面值确实是一个 const。你不能修改它。 - David Heffernan
显示剩余6条评论
3个回答

13

字符串字面量是C++中的一个const char[],可能存储在只读内存中,所以如果您尝试修改它,程序将崩溃。将非常量指针指向它是一个不好的想法。


6
无论它是否存储在只读内存中,修改它都是未定义的行为。就是这样。 - David Heffernan

8
在你的第二个例子中,你必须确保不要试图修改pc2指向的字符串。
如果你需要修改字符串,有几种替代方法:
  1. 创建一个动态分配的文字拷贝(完成后不要忘记使用free()):
  2. char *pc3 = strdup("test string"); /* 或者 malloc() + strcpy() */

  3. 使用数组而不是指针:
  4. char pc4[] = "test string";


1
+1:虽然你应该指出strdup不是标准的C语言... - Oliver Charlesworth
我使用了char pc4[] = "test string";,并且没有收到任何警告。我想知道这是否是正确的操作方式,或者我只是在我的代码中引入了一个错误... - Pietro M
@PietroM:不,只要您记住分配的数组长度为strlen("test string")+1字节即可,您不会植入任何错误。如果您需要更长的数组,可以显式指定长度:char pc4[32] = "test string"; - NPE
更准确地说,我使用了 static char pc4[] = "test string"; 并且没有收到任何警告。我这样做是因为它在函数内部,我希望字符串在函数外部也可用。我想知道这是否是正确的做法,或者我只是在我的代码中引入了一个错误... - Pietro M

7
那要看你是否需要修改字符串字面值。如果是,
char pc1[] = "test string";

4
不能修改文本本身,只能修改副本。 - David Heffernan
1
正确。您的评论非常精确。 - Mahesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接