C++ 替换字符中的字符*

C++ 替换字符中的字符*,c++,C++,如何替换char*中的字符 例如: int main() { char* hello = "hello"; int i; for (i = 0; i < 5; i++) { hello[i] = 'a'; } cout << hello; } intmain(){ char*hello=“hello”; int i; 对于(i=0;i

如何替换char*中的字符

例如:

int main() {
    char* hello = "hello";
    int i;

    for (i = 0; i < 5; i++) {
        hello[i] = 'a';
    }
   cout << hello;
}
intmain(){
char*hello=“hello”;
int i;
对于(i=0;i<5;i++){
你好[i]=“a”;
}
cout
char*hello=“hello”
应该是
char hello[]=“hello”


前一个字符串是不允许更改的字符串。后者是一个可以更改其中任何字符的数组。

这里的问题是,您有一个指向字符串文字的指针,而C++中的字符串文字是字符的常量数组。试图修改常数数据会导致未定义的行为。

您可以通过制作
hello
数组来解决此问题:

char hello[] = "hello";

原因:

char*hello=“hello”

实际上,这是一个字符串文本,链接器将这个“hello”字符串存储在程序的一个单独的内存部分,称为只读内存区域(检查链接器生成的内存映射文件(可能是.map扩展名)以查看程序内存映射)

你好

hello是一个指针变量,它将存储在程序的堆栈区域

现在指针变量hello保持只读内存的地址(字符串文本的基址)

对于上述约定,链接器将在堆栈(函数的本地)或数据内存(全局)上映射字符串“hello”

建议 如果使用字符串文字来避免意外修改只读内存,则使用关键字const。如果代码的任何部分试图修改只读区域,编译器将通过定义const抛出一个指示

const char* hello = "hello";
阅读下面的内容

来自C99标准6.4.5/5“字符串文字-语义”:

在翻译阶段7中,将值为零的字节或代码附加到 由字符串文字产生的每个多字节字符序列 或文字。然后使用多字节字符序列 仅初始化静态存储的持续时间和长度数组 足以包含序列。对于字符串文字 数组元素的类型为char,并使用 多字节字符序列的单个字节;用于宽字符串 在文本中,数组元素的类型为wchar\u t,并且已初始化 用宽字符序列

未指定这些数组是否不同,前提是它们的 元素具有适当的值。如果程序尝试 修改这样一个数组,行为是未定义的。


如果打开编译器警告,它应该能够检测类似这样的错误(以及许多其他错误)。不能替换
char*
中的字符;可以替换
char
数组中的字符。
char*
通常是指向
char
数组第一个元素的指针。
char hello[] = "hello";
const char* hello = "hello";