sizeofオペレータとの共通ピットの導入

まず、基本的な概念

sizeof C言語では、変数(またはデータタイプ)を計算するために使用されるキーワードは、現在のシステムのメモリのバイト数を占めています。

sizeofは関数ではありません書き込みはビットのsizeof関数のようですので、そのような質問は、はsizeof 2件の書き込みがありますされています。

データの種類

  sizeof(数据类型);

データ型は、括弧で囲まなければなりません。

  printf("字符型变量占用的内存是=%d\n",sizeof(char));   // 输出:字符型变量占用的内存是=1
  printf("整型变量占用的内存是=%d\n",sizeof(int));   // 输出:整型变量占用的内存是=4

変数の

  sizeof(变量名);
  sizeof 变量名;

変数名は括弧で囲まれていないことができ、括弧の使用は、より一般的には、ほとんどのプログラマは、このフォームを使用しています。

  int ii;
  printf("ii占用的内存是=%d\n",sizeof(ii));   // 输出:ii占用的内存是=4
  printf("ii占用的内存是=%d\n",sizeof ii);   // 输出:ii占用的内存是=4

第二に、ノート

1、はsizeof(構造)

メモリ内の構造の観点から理論の様々なメンバーは、行に格納され、アレイは、必ずしもすべてのメンバ変数の合計サイズと占有メモリのサイズと等しくないが、メモリ構造を取る、非常に類似しています。コンパイラの特定の実現では、メモリアドレッシングの効率を改善するために、各種部材との間に隙間があってもよいです。含有量は、全サイズはsizeof、はsizeof(名称構造)またははsizeof(変数名の構造)に占める構造によって得ることができる使用することができます。

実施例(book90.c)

/*
 * 程序名:book90.c,此程序用于演示C语言的结构体占用内存的情况
 * 作者:C语言技术网(www.freecplus.net) 日期:20190525
*/
#include <stdio.h>

// #pragma pack(1)  # 告诉编器内存按1字节对齐。

struct st_girl
{
  char name[50];     // 姓名
  int  age;          // 年龄
  int  height;       // 身高,单位:厘米cm
  char sc[30];       // 身材,火辣;普通;飞机场。
  char yz[30];       // 颜值,漂亮;一般;歪瓜裂枣。
};

int main()
{
  struct st_girl queen;
  printf("sizeof(struct st_girl) %d\n",sizeof(struct st_girl));
  printf("sizeof(queen) %d\n",sizeof(queen));
}

業績
ここに画像を挿入説明

上記の例から分かるように、構造体st_girlメモリがすべてのメンバ変数によって占有する50 + 4 + 4 + 30 + 30 = 118であるが、構造は、メモリ120によって占められています。

なお、C言語はメモリ位置合わせ構造部材の方法が提供され、構造体メンバーメモリ変数との間に隙間がの#pragmaパック(1)コードを有効にしないようにすることができます。

2、空にはsizeofを使用しないでください

  printf("sizeof(void)=%d\n",sizeof(void));  // 输出sizeof(void)=1

いくつかのコンパイラで上記のコードを渡すことはなくてもよいです。

ボイドフリータイプまたはnull値の型は、ストレージスペースの種類を知らない、コンパイラは、その大きさを決定することはできません。変数は、以下のコードはでコンパイルすることができない、無効と宣言することはできません。

  void vv;

しかし、次のコードは正しいです。

  void *pv;
  printf("sizeof(void*)=%d\n",sizeof(pv));   // 输出sizeof(void)=8

PVはボイドポインタ、64ビットオペレーティングシステムである、ポインタ変数は8によって占められるメモリのサイズ、以下同様です。

3. Doがサブルーチンでのsizeof文字ポインタを使用しません

sizeof有するサブ機能(IFサブルーチンへのアドレスの文字列(例えば、チャーSTRNAME [21])、文字へのポインタとサブルーチン(例えば、CHAR * PSTR)は、着信アドレス文字列を格納する場合PSTR)、文字列のメモリのバイト数が得られていないが、メモリのバイトの文字ポインタ変数の数(8バイト)を占有します。

文字列の長さは、サブルーチンのパラメータとして渡される場合を除きしたがって、あなたは、サブルーチンの着信文字列を初期化することができます。

4、はsizeof一方サブルーチン構造ポインタを使用しません

構造(例えば、構造体st_girl stgirl)のアドレスはsizeofとサブ関数(場合、構造の着信アドレスを格納する(例えば、構造体st_girl * pgril)、サブルーチンへの構造体へのポインタとのサブルーチンを通過した場合pgirl)、得られた構造は、メモリのバイト数によって占められるが、メモリのバイト(8バイト)の構造ポインタ変数の数を占有されていません。正しい使用方法は、はsizeof(構造体st_girl)を使用することです。

第三に、著作権表示

C言語Technology Networkのオリジナルの記事、論文、著者と元にソースリンクを明記してくださいを再現。

出典:C言語テクノロジーネットワーク(www.freecplus.net

著者:倫理規程農業

あなたにこの記事は参考になりました場合は、サポートを賞賛、あるいは、あなたのブログで私の記事を転送し、あなたに感謝してください。

元の記事を公開 ウォンの賞賛2 ビュー8337

おすすめ

転載: blog.csdn.net/u010806950/article/details/105315935