c - 使用指针简单修改C字符串

标签 c pointers cstring

我有两个指向同一个 C 字符串的指针。如果我将第二个指针递增一个,并将第二个指针的值分配给第一个指针的值,我预计第一个字符串的第一个字符将被更改。例如:

#include "stdio.h"

int main() {
  char* original_str = "ABC";        // Get pointer to "ABC"
  char* off_by_one = original_str;   // Duplicate pointer to "ABC"
  off_by_one++;                      // Increment duplicate by one: now "BC"
  *original_str = *off_by_one;       // Set 1st char of one to 1st char of other
  printf("%s\n", original_str);      // Prints "ABC" (why not "BBC"?)
  *original_str = *(off_by_one + 1); // Set 1st char of one to 2nd char of other
  printf("%s\n", original_str);      // Prints "ABC" (why not "CBC"?)

  return 0;
}

这行不通。我确信我遗漏了一些明显的东西——我对 C 的经验非常非常少。

感谢您的帮助!

最佳答案

您正在尝试修改字符串文字。字符串文字是不可修改的(即,它们是只读的)。

试图修改字符串文字的程序表现出未定义的行为:程序可能能够“成功”修改字符串文字,程序可能会崩溃(立即或稍后),程序可能会表现出异常和意外行为,或任何其他可能发生的事情。当行为未定义时,所有赌注都将取消。

您的代码将 original_string 声明为指向字符串文字 "ABC" 的指针:

char* original_string = "ABC";

如果您将其更改为:

char original_string[] = "ABC";

你应该可以开始了。这声明了一个 char 数组,该数组使用字符串文字 "ABC" 的内容进行初始化。该数组自动指定为四个元素的大小(在编译时),因为这是容纳字符串文字(包括空终止符)所需的大小。

关于c - 使用指针简单修改C字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2921376/

相关文章:

退出 fork 窗口管理器后无法输入 GtkEntry

c - `int (*B)[COLSIZE];` 和 `int *C[ROWSIZE];` 之间的区别?

c - 为什么 C 中的结构指针(方法)比普通函数慢得多?

C(void *)用作多态函数指针

c++ - 当我使用指向成员的指针调用成员函数时出现段错误

c - 为什么将操作移位 1 而不是 0?

c++ - C 字符串替换反斜杠

c++ - CString 无效*

c++ - 在 C++ 中,如果我通过引用将 CString 传递给函数并将其分配给另一个 CString,它将被截断

c++ - 通过显式调用类构造函数来使用对象与默认初始化+赋值运算符