将字符串文字分配给 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* [重复]的主要内容,如果未能解决你的问题,请参考以下文章

将'\'分配给char [重复]

内存中的字符串文字在哪里?堆栈/堆? [复制]

为啥将字符串文字传递给 char* 参数有时只是编译器错误?

使用字符串文字分配 char 数组类成员

将字符串*分配给char * c ++ [关闭]

如何在 GCC 中将重复或相乘的字符串文字合并为一个 [重复]