【问题标题】:Is there any way to change char* value at any index?有没有办法在任何索引处更改 char* 值?
【发布时间】:2017-12-08 06:19:15
【问题描述】:

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

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

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

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

char ch[] = "sitaram";

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

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

【问题讨论】:

  • char *ch = "sitaram"; 仅因为向后兼容“功能”而编译。正确的类型应该是const char *ch。正如类型所暗示的那样,您不能修改此字符串。
  • char* 是一个指针。当您编写char *ch = "sitaram"; 时,它会将ch 初始化为指向包含字符串文字"sitaram"char 数组的第一个元素。这种区别很重要。指针不是数组,数组也不是指针。
  • 区分char* 本身并不是使内存只读的原因也很重要。指针只是指向一个只读的文字值。改为指向可写内存,然后修改作品。将ch 更改为char[] 而不是char* 只会导致在初始化期间将文字数据复制到char[] 内存中。

标签: c++ arrays char


【解决方案1】:

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

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

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

【讨论】:

  • 字符串字面量(即用 "" 括起来的值)默认为 const char* ... nope 类型,它们的类型为 @ 987654322@ 并且仅在需要指针的上下文中衰减const char*
  • @zett42 它们的类型是 const char[n] 还是 const char (&)[n]?我感觉他们是后者? wandbox.org/permlink/sQCCemUzweDCDLAM
  • 来自cppreference: 1) 窄多字节字符串文字。无前缀字符串字面量的类型是 const char[]。
  • @zett42 嗯,我想知道为什么 decltype 会计算出对数组的引用
【解决方案2】:

当你说:

char *ch = "sitaram";

编译器执行以下操作:

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

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

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';

【讨论】:

    【解决方案3】:

    使用char 数组:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-15
      • 1970-01-01
      • 1970-01-01
      • 2014-06-30
      • 1970-01-01
      • 2020-12-27
      • 1970-01-01
      相关资源
      最近更新 更多