如何替换char *中的字符?
例如:
int main() {
char* hello = "hello";
int i;
for (i = 0; i < 5; i++) {
hello[i] = 'a';
}
cout << hello;
}
根本没有输出。只是暂停我并说程序没有响应。
预期输出:aaaaa
答案 0 :(得分:3)
这里的问题是你有一个指向字符串文字的指针,而C ++中的字符串文字是常量字符数组。尝试修改常量数据会导致未定义的行为。
您可以通过使hello
成为数组来解决此问题:
char hello[] = "hello";
答案 1 :(得分:2)
char* hello = "hello";
应为char hello[] = "hello";
前者是一个不允许更改的字符串文字。后者是一个数组,您可以从中更改其中的任何字符。
答案 2 :(得分:0)
<强>原因:强>
char * hello =&#34;你好&#34 ;;
实际上这是一个字符串文字,链接器存储了这个&#34;你好&#34;字符串在程序的单独内存部分称为只读存储区(检查链接器生成的内存映射文件(可能是.map扩展名)以查看程序内存映射)。
char * hello
hello是一个指针变量,它将存储在程序的堆栈区域中。
现在指针变量 hello 保留只读存储器的地址(字符串文字的基址)。
for (i = 0; i < 5; i++) {
hello[i] = 'a';
}
您正在尝试修改只读内存,在这种情况下,它取决于操作系统它生成的异常(在某些情况下,您也会发现分段错误)。
<强>解决方案:强>
在堆栈上定义数组(本地到函数)或数据存储器(全局)。
char hello[] = "hello";
对于上面的约定,链接器将映射字符串&#34; hello&#34;在堆栈上(本地到函数)或数据存储器(全局)。
<强>建议强> 使用关键字 const 如果使用字符串文字以避免意外修改只读内存,通过定义 const 编译器将指示代码的任何部分是否正在尝试修改读取只有区域。
const char* hello = "hello";
请阅读以下内容。
来自C99标准6.4.5 / 5&#34;字符串文字 - 语义&#34;:
在转换阶段7中,附加值为零的字节或代码 每个由字符串文字产生的多字节字符序列 或文字。然后使用多字节字符序列 初始化一个静态存储持续时间和长度的数组 足以包含序列。对于字符串文字, 数组元素的类型为char,并使用 多字节字符序列的各个字节;对于宽弦 文字,数组元素具有类型wchar_t,并被初始化 用宽字符序列......
未指明这些数组是否与它们不同 元素具有适当的值。 如果程序尝试 修改这样的数组,行为是未定义的。