次の C++ コード フラグメントを検討してください。関数へのパラメーターとして char * への参照を渡しています。
void name(char **str){
*str=(char *)"JUSTFORFUN";
}
int main(int argc, const char * argv[])
{
char *test;
name(&test);
cout<<test; //Prints "JUSTFORFUN"
//delete(test); //Throws error "pointer being freed was not allocated"
return 0;
}
function name() に「JUSTFORFUN」を格納するために割り当てられたメモリは、スタックに割り当てられていると思います。そのため、制御が name() の外に出ると、(char *)"JUSTFORFUN" に関連付けられたメモリはコンパイラによって解放されているはずです。私の質問は、テストを印刷しても正しい出力が得られるのはなぜですか? ジャンク値を印刷するべきではありませんでしたか?
int に似たようなことをすると。期待どおりの結果が得られます。
void nameint(int **value){
int val=5;
*value=&val;
}
int main(int argc, const char * argv[])
{
int *val;
nameint(&val);
cout<<*val; //Prints a junk value 1073828160
return 0;
}
int と char * の動作に違いがあるのはなぜですか?