似たようなものがすでにここに投稿されていたら申し訳ありませんが、実際には見つけられませんでした。
私は次のコードを持っています。これは正しくないと言いますが、正しい答えを受け取ります。
char *selectStr(int index){
char *str[] = {
"hello",
"hola",
"epa",
"alright",
};
return str[index];
}
int main() {
printf("String: %s\n", selectStr(2));
return 0;
}
これが実際に機能する理由を誰か教えてもらえますか? 私の見方: 文字列の配列はstr
selectStr 関数内のローカル変数です。この関数は、この配列に含まれる文字列を返します。しかし、この文字列の配列はstr
ローカル変数であるため、返された後にメモリから消去する必要があるため (そうですか?)、何らかのメモリ アクセス エラーが発生することを予期していました。
このコードが機能することを幸運だと考えるべきですか (つまり、これは未定義の動作ですか?)、それとも、これは実際に物事を行う良い方法です (この場合はなぜですか)?
私の推測では、配列へのポインターstr
は関数が返された後に消去されますが、それが指す実際のコンテンツは消去されず、他の何かが書き込まれるまでメモリに残ります。誰かがそれを確認できるか、実際に何が起こっているのか教えていただければ幸いです.
前もって感謝します!
PS: 私が行う方法は、バッファをパラメータとして渡すことですが、驚くべきことに (少なくとも私にとっては)、これが実際に機能する理由を知りたいと思っています。