2013-03-27 33 views
0

我對結構對齊有問題。 看來不管我做什麼,編譯器都會在結構的兩個字段之間插入一個字節。這是輸出通過指向32位的結構對齊和訪問兩個16位字段

4 +j 4 +++  40004 ......... 4 
5 +j 5 +++  50005 ......... 5 
6 +j 6 +++  60006 ......... 6 
7 +j 7 +++  70007 ......... 7 
8 +j 8 +++  80008 ......... 8 
9 +j 9 +++  90009 ......... 9 

字節00被插入爲H結構的再和IM場之間的樣本。 如何停止編譯器對H執行此操作以便 以便指針pW可以通過指針pW讀取兩個字段爲32位?

也許我需要改變3d陣列的大小。 如果有一種方式,而不改變陣列大小會很好。

#include <stdio.h> 
#include <stdlib.h> 

#define NA 4 
#define NS 3 
#define NF 5 

typedef struct { 
    short re; 
    short im; 
} cint16 ; 

typedef struct 
{ 
    cint16 H[NRx][NSTS][NFFT]; 
} AAA; 

AAA  H; 
AAA *  pH = &H; 

int main(void) 
{ 
    int i, j, k, n, m; 
    cint16 * pC; 
    int *  pW; 

    n = 0; 
    for(i=0; i<NA; i++) 
    { 
     for(j=0; j<NS; j++) 
     { 
      for(k=0; k<NF; k++) 
      { 
       H.H[i][j][k].re = n ; 
       H.H[i][j][k].im = n; 

       n++; 
      } 
     } 
    } 

    pC = &H.H[0][0][0]; 
    m = 0; 
    for(k=0; k<NA; k++) 
    { 
     for(i=0; i<NS; i++) 
     { 
      for(n=0; n<NF; n++) 
      { 
       printf("%02d ", pC[m].re); 
       printf("+j%02d,", pC[m].im); 
       printf("  "); 
       m++; 
      } 
      printf("\n"); 
     }  
    } 

    printf("\n\n"); 

    pW = (int *)&H.H[0][0][0]; 
    pC = &H.H[0][0][0]; 
    m = 0; 
    for(k=0; k<NA*NS*NF; k++) 
    { 
     printf("%2X ", pC[m].re); 
     printf("+j%2X", pC[m].im); 
     printf(" +++  "); 
     printf("%X ", pW[m]); 

     printf(" ......... %d \n", m); 

     m++; 
    } 


    exit (0); 
} 
+0

'H'不是結構體。 – unwind 2013-03-27 10:43:15

回答

1

你誤解了輸出。

printf("%X ", pW[m]); 

打印四個字節結構的作爲unsigned int以十六進制表示

4|00|04 

第一4是從一個非零的結構構件的對應於高階字節字節unsigned int(無論是re還是im都取決於字節序),接下來的兩個字節0004來自另一個成員的兩個字節。

在成員之間沒有插入字節,有一個字節(和一個半字節)由於前導零被抑制而未打印出來。

+0

謝謝。這是非常迅速的答案。我完全誤解了結果。 – Hatem 2013-03-27 10:54:47

0

這取決於你使用的編譯器。在GCC上有__attribute__ ((__packed__)),在VC++上有#pragma pack

在這裏可能有很多重複問題,顯示如何使用這些。


還有一點警告:使用32位整數訪問兩個16位值將取決於底層平臺的字節順序。如果你通過互聯網或文件發送這種結構,你必須確保你正確地轉換它。