-1

機能があります

ValArgument(char* ptr){
   char str[] = "hello world";
   ptr = &str[0];
}

この関数では、char配列を初期化し、charポインターptrに追加します。私はそのような関数を呼び出します:

char* ptr= NULL;
ValArgument(ptr);

返されるポインタの値はまだNULLです。なんで?ポインタがchar配列str[]を指すことを期待していました。

4

1 に答える 1

1

返されるポインタの値はまだNULLです。なんで?

ポインタを値で渡したためです。つまり、関数にはポインターの個別のコピーが与えられ、ポインターに加えられた変更は呼び出し元のコピーに影響を与えません。

次のいずれかを参照して渡すことができます。

void ValArgument(char *& ptr)
//                     ^

または値を返します:

char * ValArgument();

ポインタがchar配列str[]を指すことを期待していました。

いいえ; この問題を修正すると、関数が戻ったときに破棄されたローカル変数のアンデッドの殻を指し示します。ポインタを使用しようとすると、未定義の動作が発生します。

文字列で何をする必要があるかに応じて、次のことが必要になる場合があります。

  • 文字列リテラルへのポインタchar const * str = "hello world";const文字列リテラルは変更できないため、これはである必要があることに注意してください。
  • 静的配列へのポインタstatic char str[] = "hello world";。つまり、全員が共有する文字列は1つだけなので、変更を加えると全員に影響します。
  • 動的に割り当てられた配列へのポインタ。そこに行かないでください。
  • 文字列オブジェクト、std::string str = "hello world";。これは、単純な値のように渡すことができるため、エラーが発生しにくいです。
于 2013-02-04T10:49:15.860 に答える