機能があります
ValArgument(char* ptr){
char str[] = "hello world";
ptr = &str[0];
}
この関数では、char配列を初期化し、charポインターptrに追加します。私はそのような関数を呼び出します:
char* ptr= NULL;
ValArgument(ptr);
返されるポインタの値はまだNULLです。なんで?ポインタがchar配列str[]を指すことを期待していました。
返されるポインタの値はまだ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";
。これは、単純な値のように渡すことができるため、エラーが発生しにくいです。