需要帮助更改char*中的单个字符

need help changing single character in char*

本文关键字:单个 字符 char 帮助      更新时间:2023-10-16

我要回到c++,掌握指针之类的东西,但是,我希望我能得到一些帮助,理解为什么这个代码段会出现总线错误。

char * str1 = "Hello World";
*str1 = '5';

错误:总线错误:(

更普遍地说,我想知道如何更改cstring中单个字符的值。因为我的理解是*str='5'应该将str指向的值从'H'更改为'5'。所以,如果我把str打印出来,上面会写着:"5ello World"。

为了理解,我也写了这个代码片段,它按预期工作;

char test2[] = "Hello World";
char *testpa2 = &test2[0];
*testpa2 = '5';

这将提供所需的输出。那么testpa2和str1之间有什么区别呢?它们不是都指向一系列以null结尾的字符的开头吗?

当您说char *str = "Hello World";时,您正在制作一个指向不可更改的文字字符串的指针。应该要求将文字分配给const char*,但由于历史原因,情况并非如此(oops)。

当您说char str[] = "Hello World;"时,您正在生成一个数组,该数组在编译时被初始化为已知的字符串(并由其大小确定)。这可以修改。

不那么简单。:-)

第一个创建一个指向给定字符串文字的指针,该指针可以放在只读内存中。

第二个创建了一个数组(通常在堆栈上,因此是读写的),该数组初始化为给定字符串文字的内容。

在第一个示例中,您试图修改字符串文字,这会导致未定义的行为。

根据2.13.4.2中的语言标准

是否所有字符串文字distinct(即存储在不重叠对象)实现定义试图修改字符串文字未定义

在第二个示例中,您使用了字符串文字初始化,定义见8.5.2.1

字符数组(无论是纯字符,有符号字符或无符号字符)可以是由字符串文字初始化(可选择用括号括起来);一wchar_t数组可以通过宽字符串文字(可选封闭在支架中);连续的字符串文字的字符初始化的成员大堆