0

我在结构对齐方面有问题。似乎无论我做什么,编译器都会在结构的两个字段之间插入一个字节。这是输出的示例

 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);
}
4

2 回答 2

1

您误解了输出。

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

unsigned int以十六进制表示形式打印结构的四个字节

    4|00|04

第一个4来自结构成员的一个非零字节,对应于unsigned int(无论是re还是im取决于字节序)的高阶字节,接下来的两个字节,00并且04来自另一个成员的两个字节。

成员之间没有插入字节,由于前导零的抑制,有一个字节(和一个半字节)没有打印出来。

于 2013-03-27T10:46:20.910 回答
0

这取决于您使用的编译器。在 GCC 上有__attribute__ ((__packed__)),在 VC++ 上有#pragma pack.

SO上可能有很多重复的问题,显示了如何使用这些问题。


还有一点警告:使用 32 位整数访问两个 16 位值将很大程度上取决于底层平台的字节顺序。例如,如果您通过 Internet 或通过文件发送此结构,则必须确保正确转换它。

于 2013-03-27T10:42:05.037 回答