将混合类型的结构转移到不同内存位置的同一结构

时间:2015-08-30 02:35:20

标签: c pointers memory struct static

我试图创建一个小例程,它允许我通过指针创建一个结构的两个副本,并且只有当另一个结构在那时不包含数据时才将数据从一个结构转移到另一个结构。我成功将第一个字符串复制(struct member a),第二个struct成员正常,但第三个和第四个不正确。

#include "stdio.h"
#include "string.h"

struct A{
    char a[4];
    long b;
    unsigned long c;
    char d;
};

int main(){
    char mb[600];
    struct A *m1=(struct A*)mb;
    char *p=(char*)m1;
    struct A *m2=(struct A*)(mb+100);
    char *pp=(char*)m2;
    memcpy(m1->a,"123",4);
    m1->b=-123;
    m1->c=123;
    m1->d='X';
    m2->b=-456;
    unsigned long q=sizeof(m2);
    while (q-- > 0){
        if (*pp=='\0'){*pp=*p;}
        pp++;p++;
    }
    printf("A=%s B=%ld C=%ld D=%c\n",m2->a,m2->b,m2->c,m2->d);
}

代码编译工作正常。当我运行它时,我看到了这些结果:

A=123 B=-456 C=0 D=

我期待的是:

A=123 B=-456 C=123 D=X

我不想重写代码,以便我单独检查每个成员的数据值。我将使用的结构将在以后更大,并使用strcmp检查每个成员或直接比较将占用很多代码行。我正在寻找更紧凑的东西。

我该怎么做才能解决这个问题?

更新:

我更改了我的代码,现在尝试使用while循环而不是上面的代码:

    while (q-- > 0){
if (pp[q]=='\0'){pp[q]=p[q];}
}

结果仍然相同(不是我想要的)。

1 个答案:

答案 0 :(得分:2)

首先,你依赖于mb被初始化为全零,这似乎是在你运行它时偶然发生的,但是不能保证。如果您希望将其初始化为全零(并且看起来像你这样做),请明确地执行此操作:

memset(mb, 0, sizeof(mb));

那就是说,你的问题是你只复制sizeof(m2)个字节。 m2是指针,因此sizeof(m2)是指针的大小,不是大小struct A。您可能需要sizeof(*m2)