プロが教えるわが家の防犯対策術!

質問1-----------------------------------------
#include<stdio.h>

int main()
{
 int a;
 char b[10];
 for(int i = 0;i < 2;i++){
  scanf("%d",&a);
  printf("整数%d\n",a);
 }
 scanf("%s",b);
 printf("文字列%s\n",b);
}

/*
この際に、例えばabと入力すると結果が
整数-858993460
整数-858993460
文字列ab
となり整数入力を無視して進められるのはなぜでしょうか?
*/

質問2-----------------------------------------
#include<stdio.h>

void func(int**);

int main()
{
 int *p;
 func(&p);
 printf("%d",*p);
}

void func(int **pp)
{
 int n = 10;
 *pp = &n;
}

/*
func関数のnはスコープからはずれて変数の寿命がなくなるはずなのにprintfで表示されるのはなぜでしょうか?
*/

----------------------------------------------
C言語は一冊の本とネットの入門サイトをかじった程度の理解です。

A 回答 (3件)

> この際に、例えばabと入力すると結果が


> 整数-858993460
> 整数-858993460
> 文字列ab
> となり整数入力を無視して進められるのはなぜでしょうか?

scanfの仕様です。

> func関数のnはスコープからはずれて変数の寿命がなくなるはずなのにprintfで表示されるのはなぜでしょうか?

未定義の動作ですので、たまたまそうなっただけです。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
参考になりました。

お礼日時:2009/09/25 01:40

>質問1


 &a は何を指しているのでしょうか?
C言語は一冊の本にaのアドレスとと書かれていませんでしょうか?
すなわちコンパイルじに変数aに割りつけられたアドレスそのものです。
>質問2
>寿命がなくなるはず
なんで?
必ず &n すなわち変数nのアドレスが返されます。

参考までに
http://www9.plala.or.jp/sgwr-t/c/sec10-2.html
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
読解力の不足のせいか、いまいち仰られていることが理解できませんでした。
申し訳ありません。

お礼日時:2009/09/25 01:45

上の方だけ #1 の補足:


scanf の仕様で「変換できなかったら無視して終了」です. 「ab」という入力は整数にできないので, この入力は見なかったことにして scanf は返ってきます. 当然, 入力に残ったままなので結果的に「無視された」ように見えます.
このことは scanf の返り値をちゃんと確認すればわかる.
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
仕様とのことで、そう覚えるしかないみたいですね。

お礼日時:2009/09/25 01:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!