1. 程式人生 > >關於計算結構體陣列中位元組數

關於計算結構體陣列中位元組數

2.結構體計算長度,如下:
 #include <stdio.h>
#include <string.h>


struct student
{
  int num;
  char name[20];
  char sex;
  float score;
 
 };
 
main()
{
struct student stu_1, *p;
    printf("steudent len is %d\n", sizeof(struct student));  
}
 
 *****
 理論計算:結構體長度為29,但是編譯器計算為32,原因在哪裡?
 解決的辦法,分別計算包含資料的時候結構體的長度:
 當
struct student
{
  int num;
  
 };------長度為4;
 
 struct student
{
  int num;
  char name[20];
  
 };-----長度為24;
 
 struct student
{
  int num;
  char name[20];
  char sex;
 
 }; -----長度為28, 原因在這裡,為了記憶體邊緣對齊,分配了4個位元組;
 
 struct student
{
  int num;
  char name[20];
  char sex;
  float score;
 
 }; ------長度為32
 
 
 ******************
 如果:
 struct student
{
  int num;
  char name[20];
  char sex;
  char sex1;
  float score;
 
 }; --長度還是32,
 但是
  struct student
{
  int num;
  char name[20];
  char sex;
  
  float score;
  char sex1;
 

 }; ----長度為36

印象加深

  5     struct stu
  6     {
  7     double i;
  8     char a[20];
  9     char b;
 10     char d;
 11     char e;
 12     char f;
 13     
 14     float c;
 15     }                                     //這個結構體中char b d e f 無論有沒有,他的位元組數都是36個。

  3 int main()
  4 {
  5     struct stu
  6     {
  7     double i;
  8     char a[20];
  9     char b;
 10     char d;
 11     char e;
 12     char f;
 13     char g;
 14     float c;
 15     };                                           //這裡面多加了一個char g  字元型陣列位元組數溢位(原先是8*3=24個) 所以多加了4個位元組 ,也就是40個。

最後:無論struct還是union中,有int參與,都是按照4個位元組對齊存放,

計算:佔12個位元組,但是去掉  char position[10]----10,
  int  banji----4個位元組
  為什麼是12個?要麼是4, 要麼是10?
  
  測試:
    union
{
       int banji;
       char position[11];
}category;--- 佔12個位元組

 union
{
      // int banji;
       char position[11];
}category;佔11個位元組;


兩者比較,就是有了int型別後,編譯器按照4位元組對齊方式來分配記憶體了。