[1739] ローカル変数のアドレスをスタックにpushしている?
投稿者:とも
2011/09/10 21:18:23
始めて投稿します。
趣味で、オリジナルの言語を作成している途中です。
「プログラミング言語を作る」を大いに参考にさせて頂いています。
というより、かなりまねをさせてもらってます。
その中で気になるところがあり、投稿しました。
私自身はC言語をそれなりに習得しているつもりなのですが、誤解があったらご指摘下さい。
気になったのは、書籍の163ページの下部から165ページにわたる、eval_method_call_expression関数の例です。
eval系では、似たようなコードがいくつかあると思います。
関数の初頭で、resultというCRB_Value型の変数を宣言していますね。
式の評価結果をそれに詰め、最終的にcrowbarスタックにそのアドレスをpushしていると思います。
しかし、resultはローカル変数なので、関数を抜けるとその領域は既に使えないのではないか?という心配です。
Cでは関数の戻り値としてローカル変数のアドレスを返そうとすると警告が出ると思います。
書籍の例は、関数の戻り値として返しているわけではないので警告は出ないとは思います。
が、crowbarスタックにpushするということは、後からそれを使用する可能性があると思うのですが。
つまり次のプログラムと本質的には同じ事をしているように思えます。
----------------------------------------------
#include <stdio.h>
typedef struct {
int type;
char* data;
} CRB_Value;
CRB_Value *value;
void eval_method_call_expression(){
CRB_Value result;
result.type = 10;
result.data = "Hello!";
value = &result;
}
int main(){
eval_method_call_expression();
printf("%d\n", value->type);
printf("%s\n", value->data);
}
----------------------------------------------
コンパイルではエラーも警告も出ないですが、上のプログラムはもちろん不正です。
既に議論済みだったら申し訳ありません。
はたまた、私がとんでもない勘違いをしているかもしれません。
御教示をお願いいたします。