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

时间:2011-06-17 02:03:58

标签: c++ pointers

我正在回到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结尾的字符的开头?

3 个答案:

答案 0 :(得分:6)

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

当你说char str[] = "Hello World;"时,你正在创建一个数组,该数组被初始化为(和大小)编译时已知的字符串。这可以修改。

答案 1 :(得分:4)

不那么简单。 : - )

第一个为给定的字符串文字创建一个指针,允许将其放在只读存储器中。

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

答案 2 :(得分:3)

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

根据 2.13.4.2

中的语言标准
  

是否所有字符串文字都是   不同的(即存储在   非重叠对象)是   实现定义。 的影响   试图修改字符串文字   未定义

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

中定义
  

一个char数组(无论是纯字符,   signed char,或unsigned char)可以   由字符串文字初始化   (可选择用括号括起来);一个   wchar_t数组可以由a初始化   宽字符串(可选的   用括号括起来);连续   字符串文字的字符   初始化成员   阵列。