将字符串文字分配给 char* [重复]
Posted
技术标签:
【中文标题】将字符串文字分配给 char* [重复]【英文标题】:Assign a string literal to a char* [duplicate] 【发布时间】:2012-01-11 11:25:45 【问题描述】:可能重复:How to get rid of
deprecated conversion from string constant to ‘char*’
warnings in GCC?
这个作业:
char *pc1 = "test string";
给我这个警告:
警告:不推荐将字符串常量转换为 'char*'
虽然这个看起来不错:
char *pc2 = (char*)("test string");
这是一种真正更好的方法吗?
注意:由于其他原因,我不能使用const char*
。
【问题讨论】:
不要对 C 代码使用 C++ 编译器。 你真的应该为此使用const char *
...
还有哪些其他原因?
哪个编译器? gcc-4.5.1 一句话也不说。
放弃警告确实是个坏主意。只需使用char const*pc1
,一切都会好起来的。
【参考方案1】:
在第二个示例中,您必须确保不要尝试修改 pc2
指向的字符串。
如果确实需要修改字符串,有几种选择:
制作文字的动态分配副本(完成后不要忘记free()
):
char *pc3 = strdup("test string"); /* or malloc() + strcpy() */
使用数组代替指针:
char pc4[] = "test string";
【讨论】:
+1: 虽然你应该指出strdup
不是标准C...
我使用了char pc4[] = "test string";
,但没有收到任何警告。我想知道这是否是正确的方法,或者我只是在我的代码中植入了一个错误......
@PietroM:不,你没有植入任何错误,只要你记住分配的数组是strlen("test string")+1
字节长。如果需要更长的数组,可以显式指定长度:char pc4[32] = "test string";
更准确地说,我使用了static char pc4[] = "test string";
,但没有收到任何警告。我是静态的,因为它在函数内部,并且我希望字符串即使在函数之外也可用。我想知道这是否是正确的方法,或者我只是在我的代码中植入了一个错误......【参考方案2】:
字符串文字是 C++ 中的 const char[]
,并且可能存储在只读内存中,因此如果您尝试修改它,您的程序将会崩溃。将非常量指针指向它是个坏主意。
【讨论】:
无论是否存储在只读内存中,都是UB修改。故事结束。【参考方案3】:这取决于您是否需要修改字符串文字。如果是,
char pc1[] = "test string";
【讨论】:
那不让你修改文字,它让你修改一个副本 正确。你的评论很准确。以上是关于将字符串文字分配给 char* [重复]的主要内容,如果未能解决你的问题,请参考以下文章