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ページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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を使用した場合です。
LP64とIPL32というのはデータ型モデルというもので、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
総合スコア21735
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
総合スコア23272
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ポインターはメモリーのアドレスを表現するものなので、プロセッサーが扱えるメモリー空間の大きさによって決まり、ポインターが指し示す先のデータの型(intとかcharとか)の大きさと関係しません。
アドレスって何?という疑問があるなら教科書のポインターの項目を見直すか「C言語 ポインター メモリーアドレス」などのキーワードでヒットする色々な解説を見てみるとよいのではないでしょうか?
なお、今日われわれが目にする汎用計算機では64bitプロセッサー(メモリー空間を64bitで表現できるプロセッサー)が一般的と思いますのでポインターのサイズが8となるのは珍しくありません。4とか2とかになるようなプロセッサーも存在するかと思いますがなかなかお目にかかれないかも知れません。
投稿2017/06/24 04:23
総合スコア18394
0
C言語とC++は32bitと64bit等実装に応じて型のサイズが変わります。
投稿2017/06/24 04:11
退会済みユーザー
総合スコア0
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/06/24 08:19