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の場所に値を入れようとしている
ようですが、一体"&"の付け忘れによって、どんな現象が
起こっているのかが理解できません。
お分かりの方おりましたら、宜しければご教授下さいますよう
お願い致します。
12345678 = 0x00bc614e
つまり、Aはポインタであると解釈しているので、その数値が示すアドレスに書き込もうとしているが、管理外のメモリなのでエラーが出ています。
12345678 = 0x00bc614e
つまり、Aはポインタであると解釈しているので、その数値が示すアドレスに書き込もうとしているが、管理外のメモリなのでエラーが出ています。
ありがとうございます。
がしかし、12345678を例えば100にしてみると、0x00bc614eが
0x00000064に当然変わるのですが、これも管理外のメモリなので
しょうか??
おっしゃる通り、100ならアドレス0x0000064にアクセスしに行きます。
そのアドレスも多分アクセス違反の領域です。
変数のアドレスは、C言語では通常ユーザーが関知するところではなく、コンパイラによって、変数が割り当てられたアドレスを使うものです。そのための演算子が&です。
&を付け忘れたからと言って、自分でアドレスを指定しても、そのアドレスの先に変数宣言をした変数の領域が割り当てられなければ、アクセスしても大丈夫なアドレスの領域範囲内だとしても、アクセス違反になる可能性があります。
ありがとうございます。
がしかし、12345678を例えば100にしてみると、0x00bc614eが
0x00000064に当然変わるのですが、これも管理外のメモリなので
しょうか??