问题 将字符串文字分配给char * [duplicate]


可能重复:
如何摆脱 deprecated conversion from string constant to ‘char*’ 海湾合作委员会的警告? 

这项任务:

char *pc1 = "test string";

给了我这个警告:

警告:已弃用从字符串常量转换为'char *'

虽然这个似乎很好:

char *pc2 = (char*)("test string");

这是一个真正更好的方法吗?

注意:由于其他原因我不能使用 const char*


4839
2017-12-02 12:17


起源

不要将C ++编译器用于C代码。 - pmg
你真的应该使用一个 const char * 为了这... - Oliver Charlesworth
那些其他原因是什么? - Marcelo Cantos
哪个编译器? gcc-4.5.1不说一句话。 - Daniel Fischer
抛弃警告真是个坏主意。只是用 char const*pc1 一切都应该没问题。 - Jens Gustedt


答案:


字符串文字是一个 const char[] 在C ++中,可能存储在只读内存中,因此如果您尝试修改它,程序将崩溃。指向一个非常量指针是一个坏主意。


6
2017-12-02 12:25



无论它是否存储在只读存储器中,都可以通过UB对其进行修改。故事结局。 - David Heffernan


这取决于您是否需要修改字符串文字。如是,

char pc1[] = "test string";

4
2017-12-02 12:20



这不允许你修改文字,它让你修改副本 - David Heffernan
正确。你的评论很准确。 - Mahesh


在第二个示例中,您必须确保不要尝试修改指向的字符串 pc2

如果确实需要修改字符串,可以使用以下几种方法:

  1. 制作动态分配的文字副本(不要忘记 free() 它完成后):

    char *pc3 = strdup("test string"); /* or malloc() + strcpy() */

  2. 使用数组而不是指针:

    char pc4[] = "test string";


4
2017-12-02 12:20



+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