程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C語言中sizeof()的用法

C語言中sizeof()的用法

編輯:關於C語言

只要參加軟件研發的筆試C/C++)幾乎都會涉及到sizeof()的用法,我昨天也遇到了,有的也會,但是真正sizeof()的核心還是沒有領會,今天上網,無聊中就看到了詳細的sizeof()的闡述,現在分享給大家。 ------------sizeof---------------- sizeof 一般形式為:sizeofobject),也可以sizeof var_char,不過大部分programer習慣用sizeof()。      對象可以是表達式或者數據類型名,當對象是表達式時,括號可省略。sizeof是單目運算符,其運算符的含義是:求出對象在計算機內存中所占用的字節數。一般來講,不同的機器,運行不同的對象是不一樣的,當目前幾乎所有的機器都是32位,很少16位的,所以一般考試都是基於32位的window和linux的。 C語言中數據類型不多。 1.整數型的: short,int,long(我沒有考慮符號問題),一般c語言書上講,int是2個字節的,即16位,范圍是-32768-32767,long是4個字節,范圍是-2^32---2^32-1。當時在xp上運行sizeof(int)的時候,會output 4.這就是32位的原因。sizeoflong)也是4. 如下:#include "stdio.h"
#include "string.h"
#include "stdlib.h"
int main()
{
 short int sa=10;
    int a=10;
    long la=10;
    float f = 20;
    double d=20;
    char ch='c';
    char str[]="ABC";
    char *p=str;
    struct str{
  double d;
  char ch;
  int data;
 }str_wu;
 struct str1{
  char ch;
  double d;
  int data;
 }str_wu1;
    printf("sizeof(short):%d\n",sizeof(sa));
 printf("sizeof(int):%d\n",sizeof(a));
    printf("sizeof(long):%d\n",sizeof(la));
    printf("sizeof(float):%d\n",sizeof(f));
    printf("sizeof(double):%d\n",sizeof(d));
    printf("sizeof(char):%d\n",sizeof(ch));
    printf("sizeof(string):%d\n",sizeof(str));
    printf("sizeof(point address):%d\n",sizeof(p));
    printf("sizeof(Point):%d\n",sizeof(*p));
    printf("sizeof(Struct):%d\n",sizeof(str_wu));
    printf("sizeof(Struct):%d\n",sizeof(str_wu1));
    system("pause");
} 因而int,short的sizeof結果是一樣的額。 2.浮點型數據 float,double,long double 上邊的圖,long double 沒有測試忘了。。。。。)呵呵! 但是應該是16。 3。指針 對於指針,要特別區分,指針指向什麼數據,它在內存占的字節數才是它的結果。 比如:指針指向一個字符串,就是字符串的長度,因為一個字符在內存中占一個字節。若指針指向一個數據結構,則結果應該是結構型數據的內存字節數。 4。結構類型 在上面的程序中, struct str{
                          double d;
                         char ch;
                          int data;
 }str_wu;
 struct str1{
                           char ch;
                            double d;
                             int data;
 }str_wu1;

兩個不同的結構,但是內部的元素是相同的,都是double,int,char,只是順序不一樣,就結果不一樣。why? 這時因為VC存儲數據的時候要對其,具體的情況如下: 類型
  對齊方式變量存放的起始地址相對於結構的起始地址的偏移量)
  Char
  偏移量必須為sizeof(char)即1的倍數
  int
  偏移量必須為sizeof(int)即4的倍數
  float
  偏移量必須為sizeof(float)即4的倍數
  double
  偏移量必須為sizeof(double)即8的倍數
  Short
  偏移量必須為sizeof(short)即2的倍數
比如:str_wu,為上面的結構分配空間的時候,VC根據成員變量出現的順序和對齊方式,先為第一個成員dda1分配空間,其起始地址跟結構的起始地址相同剛好偏移量0剛好為sizeof(double)的倍數),該成員變量占用sizeof(double)=8個字節;接下來為第二個成員dda分配空間,這時下一個可以分配的地址對於結構的起始地址的偏移量為8,是sizeof(char)的倍數,所以把dda存放在偏移量為8的地方滿足對齊方式,該成員變量占用sizeof(char)=1個字節;接下來為第三個成員type分配空間,這時下一個可以分配的地址對於結構的起始地址的偏移量為9,不是sizeof(int)=4的倍數,為了滿足對齊方式對偏移量的約束問題,VC自動填充3個字節這三個字節沒有放什麼東西),這時下一個可以分配的地址對於結構的起始地址的偏移量為12,剛好是sizeof(int)=4的倍數,所以把type存放在偏移量為12的地方,該成員變量占用sizeof(int)=4個字節;這時整個結構的成員變量已經都分配了空間,總的占用的空間大小為:8+1+3+4=16,剛好為結構的字節邊界數即結構中占用最大空間的類型所占用的字節數sizeof(double)=8)的倍數,所以沒有空缺的字節需要填充。所以整個結構的大小為:sizeof(str_wu)=8+1+3+4=16,其中有3個字節是VC自動填充的,沒有放任何有意義的東西。 而str_wu1,同樣的道理:如下:sizeof(char)=1,而1不是8的倍數,因而增加到8,sizeofdouble)=8,現在開始地址是16,16是sizeofint)的倍數,可以存入。 因而總的地址數:sizeofchar)+7+sizeofdouble)+sizeofint)=20, 而20不是8的倍數sizeof(double)=8),所以需要在增加4個地址,即總共24。 ---------------------- sizeof具體的,我所知道的就這些了,那位高手還知道什麼,或者我寫的有什麼錯,希望指出。謝謝!  

本文出自 “喝檸檬奶茶,體驗綠色人生” 博客,謝絕轉載!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved