程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> VC中結構體內存分配問題透析

VC中結構體內存分配問題透析

編輯:vc教程

本文首先提出了處理VC++中結構體時應注意的一個問題,然後詳細分析了存在該問題的原因,最後做實戰訓練。

      注意:

     (1)在VC下,下面各類型占字節數為:char->unsigned int ->1; short int ->2; int ->unsigned int ->4;  long ->float->4;   double ->long double ->8

     (2)在TC下,下面各類型占字節數為:char->unsigned int ->1; short int ->2; int ->unsigned int ->2;  long ->float->4;   double ->8; long double ->10

一、問題提出

首先,我們來看以下兩個小程序:

  程序1:
#include <stdio.h>
struct struct1
{
char p1;

long p3;
};
main()
{
printf(″the size of the strcu=%d\n″, sizeof(struct1));
return(1);
}
  運行結果是:the size of the struct=8
  程序2:
#include <stdio.h>
struct struct2
{
char p1;
long p3;
short int p2;
};
main()
{printf(″the size of the struct=%d\n″, sizeof(struct2));
return(1);
}

  運行結果是:the size of the struct=12

問題:顯然上述兩個程序的運行結果是不同的。然而仔細觀察上述兩個程序,它們的唯一區別是變量p2在結構體struct struct1和struct struct2中的位置不同。而這一不同是如何導致程序運行結果不同呢?

二、VC++中的結構體分析

   C語言提供了一種稱為結構體的數據類型,它可以將不同類型的數據組合成一個有機整體,這樣不但便於引用,而且很清楚地反映出各數據項之間的內在聯系,因而在C語言中結構體得到廣泛的應用。正如我們已經熟知的那樣,在C語言中,結構體的長度等於各數據項長度之和,而且結構體的長度與數據項在其中的位置順序無關。例如,在TurboC中運行上述兩個例子中的程序,得到的結果都是the size of the struct=7。這是由於char數據類型的長度是1,long數據類型的長度是4,而short int數據類型的長度是2,從而得到1+2+4=7。

  那麼為什麼上述兩個例子在VC++環境下所得的結果各不相同並且均不是7呢?在實際應用中,我們發現VC++中為結構體變量分配內存時與C語言不同:VC++中為結構體分配內存時,先分配一單位長度(該單位長度的大小等於結構體中占內存最多數據類型,如struct2的單位長度為數據類型long的長度4。),然後在該單位長度中依次為結構中的變量分配空間,直至該單位空間不能再分配完一個完整的變量時為止,就再為該結構體分配另一個單位長度的存儲空間。如結構體struct2:首先,分配4個字節,p1占1個字節後,剩余的3個字節不足以分配p3,於是,系統為struct2再分配4個字節分給p3,接著下4個字節分給p2,把以,struct2共有4+4+4=12個字節。再如結構體struct1:同樣先分配4個字節,p1占1個字節後,還可為p2分配2個字節,顯然剩余的1個字節不足以為p3分配空間了,因此系統還要再為該結構體分配4個字節,該4個字節恰好是p3所需的,所以struct1共有4+4=8個字節。

  至此我們便不難理解上述兩個例子中的結果是如何算出來的。其中,例1中是4+4=8,而例2中是4+4+4=12。

三、實戰
(1)、
struct structData1
{
 int i;
 char ch;
 double d;
 short  s;
 float f;
 long l;
};
sizeof(struct structDate1) =(4+1+3空)+(8)+(2+4+2空)+(4+4空)=32

(2)、
struct structData2
{
 short int s1;
 char ch1;
 short int s2;
 char ch2;
};
sizeof(struct structDate2) =(2)+(1+1空)+(2)+(1+1空)=8

(3)、
struct structData3
{
 int s1;
 char ch1;
 short int s2;
 char ch2;
};
sizeof(struct structDate3) =(4)+(1+2+1空)+(1+3空)=12

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