ID非公開

2022/1/17 20:02

33回答

以下のコードは、メモリの不正アクセスが起こりません。 なぜでしょうか? #include <stdio.h> char *f(void) { char f_c;

ベストアンサー

0
ID非公開

質問者2022/1/17 20:33

下記mainを試してみました。 int main() { char *main_c; for (int i = 0; i < 5; i ++) { main_c = f(); printf("in main: %p\n", main_c); printf("in main: %c\n", *main_c); *main_c += 1; printf("in main: %c\n", *main_c); } return 0; }

ThanksImg質問者からのお礼コメント

ありがとうございます!勉強になりました!

お礼日時:1/24 7:05

その他の回答(2件)

0

あなたの言う通りそれは不正アクセスですし、そのプログラムは不正アクセスを行っています。 実際に問題が発生するか否かは別次元の話です。

0

C言語の変数としての寿命が終わった変数にアクセス するのはC言語プログラミング的には不正アクセスですが そういうときでも、その記憶領域が破壊されていたり そこへプロセッサがアクセスすることも禁止して くれているとも限らないという例になるかと。 OSからみて、普通のメモリアクセスですが、C言語の フレームの中から見ればしてはいけないアクセスで、変数 の記憶内容に信頼がおけなくなっている状態になっている ということです。 ご提示のプログラムでは printf("in main: %c\n", *main_c); を実行する際に*main_cの内容が書き換えられても C言語的には不思議ではありません。 再度このprintf文が実行された際に、予測もつかない ような数値が出力される可能性があります。 今回はたまたま書き換わらなかっただけと思ったほうが 良いわけです。

ID非公開

質問者2022/1/21 10:35

なるほど。OSというレンジで見れば、問題がないのですね。その支店は無かったです,ありがとうございます