人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

お世話になっております。C言語に関しての質問です。

scanf()関数を使うときに、記述の仕方は
int scanf(const char *書式指定文字列, 引数並び)
となりますが、引数並びのところに、&を記述せずとも
コンパイルは通ります。しかし、実行をするとエラーが
起こるので、初めは例えば引数を変数Aだとすると、
変数Aの中身が示す値をアドレスとして捉えて、そこに
値の入力を行おうとしているのかと思いました。

ですが、手元にある.net 2003で
#include <stdio.h>

void main(void){
int A=12345678;

printf("数値を入力\n");
scanf("%d", A);
return;
}
というプログラムをステップ実行すると、エラーメッセージは
「071018.exe の 0x0041302f でハンドルされていない
例外が発生しました : 0xC0000005: 場所 0x00bc614e に
書き込み中にアクセス違反が発生しました。 。」と出て、
何度同じことを繰り返しても、入力値を変えてみても同じ
メッセージがでました。

アドレス値0x00bc614eの場所に値を入れようとしている
ようですが、一体"&"の付け忘れによって、どんな現象が
起こっているのかが理解できません。
お分かりの方おりましたら、宜しければご教授下さいますよう
お願い致します。

●質問者: mimio17
●カテゴリ:コンピュータ 学習・教育
✍キーワード:.NET Char const C言語 exe
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● studioes
●60ポイント ベストアンサー

12345678 = 0x00bc614e

つまり、Aはポインタであると解釈しているので、その数値が示すアドレスに書き込もうとしているが、管理外のメモリなのでエラーが出ています。

◎質問者からの返答

ありがとうございます。

がしかし、12345678を例えば100にしてみると、0x00bc614eが

0x00000064に当然変わるのですが、これも管理外のメモリなので

しょうか??


2 ● tadashi0805
●10ポイント

おっしゃる通り、100ならアドレス0x0000064にアクセスしに行きます。

そのアドレスも多分アクセス違反の領域です。

変数のアドレスは、C言語では通常ユーザーが関知するところではなく、コンパイラによって、変数が割り当てられたアドレスを使うものです。そのための演算子が&です。

&を付け忘れたからと言って、自分でアドレスを指定しても、そのアドレスの先に変数宣言をした変数の領域が割り当てられなければ、アクセスしても大丈夫なアドレスの領域範囲内だとしても、アクセス違反になる可能性があります。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ