0

関数内の文字列を簡単に更新しようとしていますが、次のサンプルが機能します。

void change(char* buffer) {
  buffer[0] = 'b';
}

void main() {
  char buffer[20] = "abc   def   ghi   j\0";
  printf("before: .%s., %p\n", buffer, buffer);
  change(buffer);
  printf("after:  .%s.\n", buffer);
}

しかし、char[]の代わりにchar*をバッファに使用すると、関数でエラーが発生します。したがって、次の例は機能しません。

void compact(char* buffer) {
  buffer[0] = 'b';
}

void main() {
  char* buffer="abc   def ghi\0";
  printf("before: .%s., %p\n", buffer, buffer);
  change(buffer);
  printf("after:  .%s.\n", buffer);
}

私が間違っていることについて何か提案はありますか?ありがとう。

ドン

4

3 に答える 3

2

を使用すると、変数は文字列リテラルchar*を指し、未定義の動作を呼び出します。

文字列リテラルを変更することはできません。このようにポインタを宣言すると

char* buffer="abc   def ghi\0";

buffer読み取り専用メモリを指します(おそらく、実装が定義されています)。とにかく、内容を変更することはできません。この構文はCとの互換性のために保持されていますが、IMO、これはコンパイルされるべきではありません。そのようなもの(char*C文字列を指している)を見つけたら、すぐに頭の中でそれを次のように翻訳します

const char* buffer="abc   def ghi\0";

C++メガネをかけます。それらを持っていない場合は、ペアを入手してください(このように、参照によって地元の人を返す、戻るのを忘れるなど、あらゆる種類のものが表示されます)。

他の場合:

char buffer[] = "abc   def ghi\0";

実際に必要なサイズの配列を作成し、そのコンテンツを入力するため、問題ありません。これは、文字列リテラルへのポインタではなくなりました。

于 2012-08-14T00:40:49.867 に答える
1

リテラルを変更することはできません。変数のみを変更できます。あなたはこれと同等のことをしようとしています:

void increment(int &f) { ++f; }

increment(2);

明らかにそれは意味がありません。値を変更するには、コードが割り当てたメモリのどこかに値を保存する必要があります。定数を最初にコピーせずに変更することはできません。

于 2012-08-14T00:42:39.097 に答える
0
char* buffer="abc   def ghi\0";

これは定数文字列であり、変更することはできません。

const文字列を指すchar*(const char *ではない) 使用するためほとんどのコンパイラは警告を表示します。

于 2012-08-14T00:45:52.667 に答える