如何将未打包结构体的内容复制到 __packed__ 结构体中?

3
我从这里了解到了__packed__,我理解当在structunion中使用__packed__时,它意味着成员变量被放置在最小化存储structunion所需内存的方式中。
现在考虑以下代码中的结构体。它们包含相同的元素(相同的type,相同的变量名并按相同顺序放置)。不同之处在于,一个是__packed__,而另一个则没有。
#include <stdio.h>

int main(void)
{

    typedef struct unpacked_struct {
        char c;
        int i;
        float f;
        double d;
    }ups;

    typedef struct __attribute__ ((__packed__)) packed_struct {
        char c;
        int i;
        float f;
        double d;
    }ps;

    printf("sizeof(my_unpacked_struct)  : %d \n", sizeof(ups));
    printf("sizeof(my_packed_struct)    : %d \n", sizeof(ps));

    ups ups1 = init_ups();
    ps ps1;

    return 0;
}

有没有一种方法可以将未打包的结构ups1复制到已打包的结构ps1中,而不需要进行逐个成员变量复制?是否有类似memcpy()的东西在这里适用?


我不明白为什么你需要这样的东西。我相信你会使用打包结构或常规结构,而不是两者都用? - Kijan
2个回答

7

很抱歉,您必须手动编写此内容。我不知道任何标准C(或我所知道的任何标准)可以为您完成此操作。只需编写一次,然后永远不要再考虑它。

ps ups_to_ps(ups ups) {
    return (ps) {
        .c = ups.c,
        .i = ups.i,
        .f = ups.f,
        .d = ups.d,
    };
}

没错。x.c = y.c; x.i = y.i; ... - David Grayson
@MattJoiner 我也有同样的担忧。我会等待更多(不同的)答案!..感谢你的好回答..我给你点赞! - Sangeeth Saravanaraj

1

如果没有对这两种结构的内存布局差异有详细了解,那么不行。


1
好观点。但是一旦我们开始基于内存布局进行编程,可能会遇到一些不必要或不想要的复杂性!..谢谢你的回答。我给你加了1分! :) - Sangeeth Saravanaraj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接