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

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

ただいまの
回答率

88.04%

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

解決済

回答 5

投稿

  • 評価
  • クリップ 1
  • VIEW 11K+

score 20

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

checkベストアンサー

+4

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 17:19

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

    キャンセル

+1

こんにちは。

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

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

int main()
{
    int aData=100;
    int* aPointer=&aData;

        :

    return 0;
}

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

イメージ説明

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/24 17:19

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

    キャンセル

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/24 17:20

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

    キャンセル

0

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/24 17:20

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

    キャンセル

0

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/24 17:20

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

    キャンセル

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

  • ただいまの回答率 88.04%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る