有没有办法在任何索引处更改char *值?

时间:2017-07-04 17:46:25

标签: c++ arrays char

据我所知,如果我们在程序中声明char*,那么它会从只读区域提供内存,因此我们无法在数组中的任何位置更改char

char *ch = "sitaram";
ch[2] = 'y';

上面的代码无法正常运行,因为我们正在更改只读内存。

一种方法是我们可以将char数组声明为

char ch[] = "sitaram";

然后我们可以在索引处更改值。

我有什么方法可以在char的任何索引处更改char*值吗?

3 个答案:

答案 0 :(得分:5)

使用现代C ++方法获取可变字符串值

std::string str{"sitaram"};
str[2] = 'y';

字符串文字(即""中包含的值)默认为类型const char[n](其中n是空字符的字符串文字+1的长度)在C ++中,由于它们是不可变的,任何修改它们的尝试都会产生undefined behavior

答案 1 :(得分:1)

使用char数组:

char text[] = "sitaram";
text[3] = 'o';
char * p = &text[0];
p[4] = 'x';
cout << text;

答案 2 :(得分:1)

当你说:

char *ch = "sitaram";

编译器执行以下操作:

  • 它在程序启动时分配字符串“sitaram”(静态存储持续时间)。该字符串可以放入只读存储器中。
  • 当你的程序到达这一行时,它会分配指针ch,并使该指针指向静态分配的“sitaram”字符串。
  • 如果你执行ch[2] = 'y',那么你正在尝试修改静态分配字符串的第3个字符。通常,你会崩溃(因为它在只读内存中)

另一方面,如果您执行以下操作:

char ch[] = "sitaram";

当程序点击此行时,它为数组ch[](8个字符)分配内存,然后将字符串“sitaram”复制到此内存中。如果你做ch[2] = 'y',那么你修改这个分配的内存,这是完全可以的。

如果要使用char *修改字符串,则应指向可修改的内存。例如:

char ch[] = "sitaram";
char *xx = ch;
xx[2] = 'y'; // it is the same as ch[2] = 'y';