お世話になっております。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の場所に値を入れようとしている
ようですが、一体"&"の付け忘れによって、どんな現象が
起こっているのかが理解できません。
お分かりの方おりましたら、宜しければご教授下さいますよう
お願い致します。

回答の条件
  • 1人2回まで
  • 登録:2007/10/19 15:35:35
  • 終了:2007/10/19 16:45:04

ベストアンサー

id:studioes No.1

studioes回答回数522ベストアンサー獲得回数612007/10/19 15:39:32

ポイント60pt

12345678 = 0x00bc614e

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

id:mimio17

ありがとうございます。

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

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

しょうか??

2007/10/19 15:48:36

その他の回答(1件)

id:studioes No.1

studioes回答回数522ベストアンサー獲得回数612007/10/19 15:39:32ここでベストアンサー

ポイント60pt

12345678 = 0x00bc614e

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

id:mimio17

ありがとうございます。

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

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

しょうか??

2007/10/19 15:48:36
id:tadashi0805 No.2

tadashi0805回答回数287ベストアンサー獲得回数292007/10/19 16:42:37

ポイント10pt

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

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

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

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

  • id:mimio17
    もしかして、
    「変数Aのなかにある値を示すが、そこが別の仕事で使われていれば、かち合うことになり、エラーとなる。」
    ということなのでしょうか・・・??
  • id:studioes
     管理外のメモリと言うのは、malloc等により確保したメモリでないと言うことです。
     100などと直接指定したアドレスに対する書き込みは、通常OSの保護によりエラーになります(組み込みなどの低レベルプログラミングであれば出来ます)
     int A=100は、int型のメモリを確保していますが、このAのアドレスは動作時に確定するので、プログラムを書く時点では不定です(例えば、実行時には0x10が変数Aに割り当てられ、0x10に100が格納されるわけです。 そして、ポインタを渡す処理では、&Aとして0x10が渡されるべきですが、Aでは0x10に格納された値、0x64が渡されるので、そのアドレスはプログラムにより確保されていない、管理外のアドレスであるため、エラーが検出されます)
  • id:mimio17
    ありがとうございます!よく分かりました。
    >直接指定したアドレスに対する書き込みは、通常OSの保護によりエラーになります

    これはそうですね、思い出せました。。
    丁寧な解説ありがとうございました。
  • id:mimio17
    tadashi0805さん
    回答ありがとうございます。私はオープンさせていただいていないので、
    どうしてtadashi0805さんの回答が見られるようになったのか仕組みが
    よく分からないのですが・・(?_?)(ポイントも減っていない)
    studioesさんの回答と合わせて、より理解できました。
    ありがとうございました。

  • id:cx20
    > tadashi0805さんの回答が見られるようになったのか仕組み

    質問終了後、未閲覧となった回答は誰でも20ポイントを支払うことで、回答オープンすることが可能です。
    どなたかが回答オープンしたのでしょう・・・。

    ■ 人力検索はてなのヘルプ - 回答オープン:20ポイントで質問者が未読の回答を開く
    http://hatenaquestion.g.hatena.ne.jp/keywordlist?word=20
  • id:mimio17
    cx20さん
    ご親切に、ありがとうございます!

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません