質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.49%
C

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

Q&A

解決済

3回答

1221閲覧

Cでの&についての警告について

teireken

総合スコア19

C

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

0グッド

0クリップ

投稿2019/01/19 03:37

gcc 7.3.0です。

C

1#include <stdio.h> 2int main(int argc, char *argv[]){ 3int a,b; 4 5printf("%0X %0X %ld\n",&a,&b,&b-&a); 6 7return 0; 8}

関連する質問は2つあります。
まず、第1に、コンパイルすると以下のエラーが出ますが、&aは警告出ないのに、なぜ&bだけ警告が出るのでしょうか。
第2の質問ですが、実行すると、&bと&aの差は4なのに、&b-&aが4にならずに1になるのはなぜなのでしょうか。

test.c:5:15: warning: format ‘
%X’ expects argument of type ‘
unsigned int’, but argument 3has type ‘int *’ [-Wformat=]
printf("%0X %0X %ld\n",&a,&b,&b-&a);

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

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

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

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

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

guest

回答3

0

同一行に複数の同じ警告がある場合は省略されるというのはよくある実装です

#これはあくまでコンパイラ依存の話です

ポインタの引き算は方のサイズで割った値になる、ということで、純粋にアドレスの差をみたいなら、
(char*)&b - (char*)&a
とするとか
(long)&b - (long)&a
とするとかする必要があります

#警告出るかも

投稿2019/01/19 07:39

編集2019/01/19 07:43
y_waiwai

総合スコア87747

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

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

teireken

2019/01/19 11:47

(char*)&b - (char*)&aでも(long)&b - (long)&aでもイケました。 のんびりした感想ですが、おもしろいですね。ありがとうございます。
guest

0

ベストアンサー

まず、第1に、コンパイルすると以下のエラーが出ますが、&aは警告出ないのに、なぜ&bだけ警告が出るのでしょうか。

単に同じ関数に2回警告を出すのが面倒なだけかもしれません。アドレスを出力したい場合は%pが正当です。

第2の質問ですが、実行すると、&bと&aの差は4なのに、&b-&aが4にならずに1になるのはなぜなのでしょうか。

ポインタの引き算をすると、指す先の型のサイズで割った値になります。

投稿2019/01/19 04:02

maisumakun

総合スコア145183

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

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

teireken

2019/01/19 11:44

ありがとうございます。納得いたしました
guest

0

次の実行例を研究してみてください。

イメージ説明

イメージ説明

イメージ説明

投稿2019/01/19 12:12

katoy

総合スコア22324

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

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

teireken

2019/01/19 12:29

&s[i]-&s[0]で8:1になるのはlongが8バイトということという理解であっていますか?
katoy

2019/01/19 22:40

はい、そうです。 sizeof(char), sizeof(int), sizeof(long) を printf させて確認することができます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問