3

同じC文字列へのポインタが2つあります。2番目のポインターを1つインクリメントし、2番目のポインターの値を最初のポインターの値に割り当てると、最初の文字列の最初の文字が変更されると予想されます。例えば:

#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"。配列には、文字列リテラル(nullターミネータを含む)を保持するために必要なサイズであるため、(コンパイル時に)4つの要素のサイズが自動的に与えられます。

于 2010-05-27T13:13:23.427 に答える
1

問題は、読み取り専用の文字通りの「ABC」を変更できないことです。

を試してくださいchar[] original_string = "ABC"。これは、配列を使用して、変更可能な文字列を保持します。

于 2010-05-27T13:15:33.653 に答える