🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

1903閲覧

変数のアドレスを取得するプログラムで異なる結果が出力される

ro_rentu

総合スコア5

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2021/01/05 05:15

前提・実現したいこと

エラーやwarningは出ませんが実現したい値と異なる結果が出力されます。
アドレスの値が異なってしまいます。

aの値は100、大きさは4byte、アドレスは0x28fddc bの値は123.400000、大きさは8byte、アドレスは0x28fdcc cの 値は123.400002、大きさは4byte、アドレスは0x28fdc0 dの値はa、大きさは1byte、アドレスは0x28fdb7

該当のソースコード

c

1#include <stdio.h> 2 3int main(void){ 4 int a = 100; // int型の変数 5 double b = 123.4; // double型の変数 6 float c = 123.4f; // float型の変数(数値の後ろにfつける) 7 char d = 'a'; // char型の変数 8 printf("aの値は%d、大きさは%lubyte、アドレスは0x%d\n",a,sizeof(int),a); 9 printf("bの値は%f、大きさは%lubyte、アドレスは0x%lf\n",b,sizeof(double),b); 10 printf("cの値は%f、大きさは%lubyte、アドレスは0x%f\n",c,sizeof(float),c); 11 printf("dの値は%c、大きさは%lubyte、アドレスは0x%c\n",d,sizeof(char),d); 12 return 0; 13}

試した結果

aの値は100、大きさは4byte、アドレスは0x100 bの値は123.400000、大きさは8byte、アドレスは0x123.400000 cの値は123.400002、大きさは4byte、アドレスは0x123.400002 dの値はa、大きさは1byte、アドレスは0xa

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

printfのフォーマット指定子は%pでポインタアドレス表示ができます。
それと変数のポインタを取得する時は

&変数名

で取得しなければならない点にも注意したほうが良さそうです。

diff

1#include <stdio.h> 2 3int main(void){ 4 int a = 100; // int型の変数 5 double b = 123.4; // double型の変数 6 float c = 123.4f; // float型の変数(数値の後ろにfつける) 7 char d = 'a'; // char型の変数 8- printf("aの値は%d、大きさは%lubyte、アドレスは0x%d\n",a,sizeof(int),a); 9+ printf("aの値は%d、大きさは%lubyte、アドレスは%p\n",a,sizeof(int),&a); 10- printf("bの値は%f、大きさは%lubyte、アドレスは0x%lf\n",b,sizeof(double),b); 11+ printf("bの値は%f、大きさは%lubyte、アドレスは%p\n",b,sizeof(double),&b); 12- printf("cの値は%f、大きさは%lubyte、アドレスは0x%f\n",c,sizeof(float),c); 13+ printf("cの値は%f、大きさは%lubyte、アドレスは%p\n",c,sizeof(float),&c); 14- printf("dの値は%c、大きさは%lubyte、アドレスは0x%c\n",d,sizeof(char),d); 15+ printf("dの値は%c、大きさは%lubyte、アドレスは%p\n",d,sizeof(char),&d); 16 return 0; 17}

投稿2021/01/05 05:30

編集2021/01/05 05:34
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ro_rentu

2021/01/05 06:57

アドレスってコンピュータごとに変わりますか? 例題と同じにならないのですが気にしなくていいのでしょうか ``` aの値は100、大きさは4byte、アドレスは0x16f6a7a88 bの値は123.400000、大きさは8byte、アドレスは0x16f6a7a80 cの値は123.400002、大きさは4byte、アドレスは0x16f6a7a7c dの値はa、大きさは1byte、アドレスは0x16f6a7a7b ``` このような結果になりました。
退会済みユーザー

退会済みユーザー

2021/01/05 07:17

試しに上記コードを何度か実行してみて下さい。 ポインタアドレスが一致することはないはずです(よほど運が良ければ別ですが・・・) 変数のポインタアドレスはコンピュータごとに変わるのではなく 実行時にそのコンピュータ上の未使用のメモリの兼ね合いで決まるので 一致しなくても問題ないはずです。
guest

0

(誤解で回答したので削除)

投稿2021/01/05 05:18

編集2021/01/05 05:19
maisumakun

総合スコア145965

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

printf("aの値は%d、大きさは%lubyte、アドレスは0x%d\n",a,sizeof(int),a);

アドレスを出力するようにはなっていません
そもそも16進数で出力するようにもなってませんね

投稿2021/01/05 05:18

編集2021/01/05 05:19
y_waiwai

総合スコア88038

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問