0

假设我们有一个具有 4 个 1 字节成员的结构。我想使用 Xyz 作为内存地址并将其转换为 32 位指针,然后我将为它分配值。这样,我就可以一次设置所有字节成员。这只是我的问题的一个示例,char、int 或设置为 256 只是任意示例。

 #include <stdio.h>

    struct temp{
        char abc;
        char def;
        char ghk;
        char lmn;
    }xyz;

    int main()
    {
        xyz = (struct temp){11,22,33,44};
        printf("Byte1 %d\r\n",xyz.abc);
        printf("Byte2 %d\r\n",xyz.def);
        printf("Byte3 %d\r\n",xyz.ghk);
        printf("Byte4 %d\r\n",xyz.lmn);    
        *((unsigned int*)xyz) = 256;
        printf("Byte1 %d\r\n",xyz.abc);
        printf("Byte2 %d\r\n",xyz.def);
        printf("Byte3 %d\r\n",xyz.ghk);
        printf("Byte4 %d\r\n",xyz.lmn); 
        return 0;
    }

在这里,我为按预期工作的数组准备了类似的方法;

#include <stdio.h>

char mem[4];

int main()
{
    mem[0] = 49;
    mem[1] = 50;
    mem[2] = 51;
    mem[3] = 52;
    printf("Byte1 %d\r\n",mem[0]);
    printf("Byte2 %d\r\n",mem[1]);
    printf("Byte3 %d\r\n",mem[2]);
    printf("Byte4 %d\r\n",mem[3]);    
    *(int*)mem = 256;
    printf("Byte1 %d\r\n",mem[0]);
    printf("Byte2 %d\r\n",mem[1]);
    printf("Byte3 %d\r\n",mem[2]);
    printf("Byte4 %d\r\n",mem[3]);
    return 0;
}

如何使用 struct 执行与数组相同的操作?

4

1 回答 1

0

这个:

*((unsigned int*)xyz) = 256;

是一个严格的混叠违规。这意味着您不能将指针指向一种类型,将其转换为另一种类型,取消对转换后的指针的引用,并期望一切正常。唯一的例外是强制转换为指针以char *读取其他类型的单个字节。

但是,您可以做的是使用union. 允许写入 a 的一个成员union并从另一个成员读取以将字节重新解释为不同的类型。例如:

union u {
    int i;
    struct {
        char c1;
        char c2;
        char c3;
        char c4;
    } s;
};

...

union u u1;
u1.i = 256;
printf("byte1=%02x\n", u1.c1);
printf("byte2=%02x\n", u1.c2);
printf("byte3=%02x\n", u1.c3);
printf("byte4=%02x\n", u1.c4);
于 2020-05-19T00:40:43.667 回答