私たちは、コードのこの部分を実行すると、それが正常に動作し、画面上string constant
を印刷します:この場合、char []とchar *はどう違うのですか?
char *someFun(){
char *temp = "string constant";
return temp;
}
int main(){
puts(someFun());
}
しかし、私たちは、次のようなコードを実行すると、それが画面上にいくつかのゴミを仕事と印刷されません。
char *someFun1(){
char temp[ ] = "string";
return temp;
}
int main(){
puts(someFun1());
}
理由は何ですか?本質的に、両方の関数は似たようなことをします(つまり、 "文字列"を返す)が、それでもそれらは異なった振る舞いをします。何故ですか?
引数、戻りアドレスやフレームポインタのような制御情報、 'puts()'のローカル変数は 'someFun1()'のローカル変数(配列)が以前に使った空間を使用している可能性があります。 –
ちなみに、文字列リテラルを扱うときの問題を避けるためには、 'const char *'変数の中にポインタを格納する必要があります。そうすれば、コンパイラはそれらを変更しようとするとあなたをブロックします。 –