簡體   English   中英

結構對齊和通過指向32bit的指針訪問兩個16bit字段

[英]Struct Alignment & Access two 16bit fields via pointer to 32bit

我在結構對齊上遇到問題。 看來不管我做什么,編譯器都會在結構的兩個字段之間插入一個字節。 這是輸出的樣本

 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結構的re和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);
}

您誤解了輸出。

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

以十六進制表示形式將結構的四個字節打印為unsigned int

    4|00|04

4來自struct成員的一個非零字節,該字節對應於unsigned int的高位字節(無論是re還是im取決於字節序),接下來的兩個字節0004來自這兩個字節其他成員的。

成員之間沒有插入字節,由於抑制了前導零,所以沒有打印出一個字節(和一個半字節)。

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

SO上可能有很多重復的問題,這些問題說明了如何使用這些問題。


還有一點警告:使用32位整數訪問兩個16位值將在很大程度上取決於基礎平台的字節順序。 例如,如果通過Internet或通過文件發送此結構,則必須確保正確轉換。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM