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

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

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

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

Q&A

解決済

5回答

17962閲覧

c言語のint型のポインタサイズ

nao_13jp

総合スコア20

C

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

0グッド

1クリップ

投稿2017/06/24 03:56

C言語を勉強しています。
ポインタの勉強の中でポインタのサイズを表示させるコードを作って実行したところ、int型が8byteと表示されす。
int型は4byteと表示されるはずなのでなぜこうなるのかわかりません。
ご教示お願いいます。
なお、環境は、Virtualbox上のcenntos、コンパイルにはgccを使っています。

//コード int main(int argc, char const *argv[]) { short int *p ; printf("%d\n",sizeof(p)); return 0; } //コンパイル&実行 >gcc -o pointer pointer.c >./pointer 8

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

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

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

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

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

guest

回答5

0

ベストアンサー

int型もポインタ型も○バイトという決まりはありません。規格上の決まりは、int型は2バイト以上であると言うことだけです。もし、int型は4バイト、ポイント型も4バイトと決め打ちで書いている書籍やサイトがありましたら、Cの知識が劣っている人が書いていますので、参考にされない方が良いです。ほとんどの場合、他にも多くの間違いがあります。

では、実際にint型やポイント型がどうかというと、環境依存になります。CPU、OS、コンパイラ、コンパイル時のオプション等いろいろな要素によって決定されます。全く同じCPU、同じOS、同じコンパイラ、同じオプションになっていない限り、必ず同じであるとは言えません。

OSがCentOS、コンパイラがGCCと言う場合は、CPUと入れたOSのバージョンの他、-m32オプションがあるかどうかでパターンが分かれます。

|CPU|OS|-m32無し|-m32有り|
|---|---|---|
|x86_64|CentOS 7 x86_64|LP64|IPL32|
|x86_64|CentOS 6 x86_64|LP64|IPL32|
|x86_64|CentOS 6 i386|IPL32|IPL32|
|x86|CentOS 6 i386|IPL32|IPL32|

※ CentOS 7にはi386版がありません。
※ x86にx86_64版はインストールできません。
※ i386版では-m32オプションを設定しても意味がありません。
yum install gccでインストールされるgccを使用した場合です。

LP64IPL32というのはデータ型モデルというもので、int型などがどれぐらいのサイズを使うかを表した物です。他によく目にするのは、64bit版Windowsで採用されているLLP64があります。

|データ型モデル|intのサイズ|longのサイズ|long longのサイズ|ポインタのサイズ|
|---|---|---|---|
|IPL32|4(32)|4(32)|8(64)|4(32)|
|LLP64|4(32)|4(32)|8(64)|8(64)|
|LP64|4(32)|8(64)|8(64)|8(64)|

※ それぞれ「バイト(bit)」です。また、これらのデータ型モデルでは1バイトは8bitです(他の環境では1バイトが8bitであるとは限りません)。

上記を踏まえて、コードを見ます。sizeof(p)はpのサイズです。pはshortのポインタです。つまり、sizeof(p)はポインタのサイズとなります。どの型のポインタであってもポインタのサイズは同じなのでshortのポインタであることは気にする必要はありません。表によるとIPL32では4バイト、LP64では8バイトです。x86_64のCPUでx86_64版のCentOSを入れ、コンパイル時に-m32オプションを指定しなければLP64になりますので、もしそのような環境であれば、8バイトと表示されると言うことになります。

投稿2017/06/24 04:36

raccy

総合スコア21735

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

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

nao_13jp

2017/06/24 08:19

ありがとうございました。 よく使われているweb上の参考書を利用して勉強していますが、ここまで詳しく解説されているものはありませんでしたので目から鱗です。 ほとんどが、環境により異なるみたいなことが書いてあるだけでしたので、この「環境による」という意味が理解できたような気がします。 本当にありがとうございました。
guest

0

こんにちは。

ポインタ型は、ポインタが指す先のアドレスです。
従って、そのサイズは、メモリ・アドレスを記録するために必要なバイト数となります。

例えば、下記プログラムがあったとしてます

C

1int main() 2{ 3 int aData=100; 4 int* aPointer=&aData; 5 6 : 7 8 return 0; 9}

これをx86系のCPUのlinuxのgccで64ビットでビルドすると、下記のようなメモリ・イメージになります。

イメージ説明

x86系のCPUはリトルエンディアンですので、低い方のバイトがアドレスの若い方に保存されます。
なお、アドレスは走らせる度に異なります。
また、ポインタのサイズやint型のサイズはコンパイラによって異なりますのでご注意下さい。

投稿2017/06/24 05:48

Chironian

総合スコア23272

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

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

nao_13jp

2017/06/24 08:19

ありがとうございました。 メモリイメージとても勉強になりました。
guest

0

int型は4byteと表示されるはずなので

何故そう思ったのでしょうか?それは間違いです。
ポインタサイズはそのポインタの指す型に依らず同じです。何バイトになるかどうかは環境に依ります。

Virtualbox上のcenntos、コンパイルにはgccを使っています。

64bitのCentOSならおそらく64bitのgccが入っていると思うので、デフォルトだと8バイトですね。

投稿2017/06/24 04:25

otn

総合スコア84489

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

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

nao_13jp

2017/06/24 08:20

ありがとうごさいました。
guest

0

ポインターはメモリーのアドレスを表現するものなので、プロセッサーが扱えるメモリー空間の大きさによって決まり、ポインターが指し示す先のデータの型(intとかcharとか)の大きさと関係しません。

アドレスって何?という疑問があるなら教科書のポインターの項目を見直すか「C言語 ポインター メモリーアドレス」などのキーワードでヒットする色々な解説を見てみるとよいのではないでしょうか?

なお、今日われわれが目にする汎用計算機では64bitプロセッサー(メモリー空間を64bitで表現できるプロセッサー)が一般的と思いますのでポインターのサイズが8となるのは珍しくありません。4とか2とかになるようなプロセッサーも存在するかと思いますがなかなかお目にかかれないかも知れません。

投稿2017/06/24 04:23

KSwordOfHaste

総合スコア18394

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

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

nao_13jp

2017/06/24 08:20

ありがとうごさいました。
guest

0

C言語とC++は32bitと64bit等実装に応じて型のサイズが変わります。

C/C++における整数型には気をつけよ

投稿2017/06/24 04:11

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

nao_13jp

2017/06/24 08:20

ありがとうごさいました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問