3

我有两个指向同一个 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 的经验非常非常少。

谢谢你的帮助!

4

2 回答 2

10

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

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

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

char* original_string = "ABC";

如果您将其更改为:

char original_string[] = "ABC";

你应该很高兴。char这声明了一个用字符串字面量的内容初始化的数组"ABC"。该数组被自动赋予四个元素的大小(在编译时),因为这是保存字符串文字(包括空终止符)所需的大小。

于 2010-05-27T13:13:23.427 回答
1

问题是您不能修改只读的文字“ABC”。

Try char[] original_string = "ABC",它使用一个数组来保存您可以修改的字符串。

于 2010-05-27T13:15:33.653 回答