ページ 1 / 1
違いを教えてください
Posted: 2022年4月23日(土) 14:23
by toma
以下の2つの出力がどちらも5になります。2番目のプログラムでポインタのアドレスが出力されないのはなぜでしょうか。
コード:
#include <stdio.h>
int main(){
int *w;
int a=5;
w = &a;
print("%d\n",*w);
}
コード:
int main(){
int *w=5;;
print("%d\n",w);
}
Re: 違いを教えてください
Posted: 2022年4月23日(土) 19:01
by box
本当にprint関数を使っているんですか?
標準ライブラリーのprintf関数ではなくて?
もし、print関数が自作であるなら、そのコードを含めて
すべてのソースを正確に見せてください。
もし、printf関数を使っているのならば、そのコードを
正確に見せてください。まずはそこからです。
Re: 違いを教えてください
Posted: 2022年4月23日(土) 20:57
by toma
コード:
#include <stdio.h>
int main(){
int *w;
int a=5;
w = &a;
printf("%d\n",*w);
}
コード:
#include <stdio.h>
int main(){
int *w = 5;
printf("%d\n",w);
}
これです。のせまちがえてました。
Re: 違いを教えてください
Posted: 2022年4月23日(土) 21:28
by box
ポインター変数wに、即値を直接代入することは未定義のはずです。
したがって、どんな結果が出ても不思議ではありません。
もし、アドレス値を出力したいのであれば、
コード:
#include <stdio.h>
int main(void)
{
int *w;
printf("%p\n", w);
return 0;
}
な風にすればよいと思います。
Re: 違いを教えてください
Posted: 2022年4月23日(土) 23:59
by みけCAT
box さんが書きました: ↑3年前
ポインター変数wに、即値を直接代入することは未定義のはずです。
(0を除く)整数からポインタへの変換は「処理系定義」であり、「未定義」ではないと思います。
(
N1570 6.3 Conversions → 6.3.2.3 Pointers)
ただし、
toma さんが書きました: ↑3年前
コード:
int *w = 5;
printf("%d\n",w);
のように、書式 %d に int* 型の値を渡すのは、書式と渡されるデータの型がマッチしないので未定義動作になります。
(N1570 7.21.6.1 The fprintf function の 9)
box さんが書きました: ↑3年前
もし、アドレス値を出力したいのであれば、
コード:
#include <stdio.h>
int main(void)
{
int *w;
printf("%p\n", w);
return 0;
}
な風にすればよいと思います。
未初期化の自動変数の値は不定であり、その値を使うと未定義動作になります。
また、書式 %p が受け取るのは void* 型のデータであり、
int* 型のデータを渡すのは(通常の環境では問題にはなりにくそうですが、厳密には) 未定義動作になります。
コード:
#include <stdio.h>
int main(void)
{
int a;
int *w = &a; /* 初期化する */
printf("%p\n", (void*)w); /* 正しい型にキャストする */
return 0;
}
な風にすればよいと思います。