等同两个结构但想要更改其中一个字段

时间:2016-06-21 05:50:02

标签: c

我将两个结构等同于num1和num。我想要做的是更改num1的一个字段而不更改其他字段,其余字段应该等于num的字段。但是以下代码最终会更改num和num1这两个字段。有人能说出理由吗?

#include <stdio.h>
#include <stdlib.h>
int main()
{
    typedef struct
    { 
        int one;
        int two;
    }Num;

    Num *num;
    Num *num1;
    num=malloc(sizeof(Num));
    num->one=1;
    num->two=2;
   // num1=malloc(sizeof(Num));
    num1=num;
    num1->one=10;
    //num1->two=2;

    printf("%d %d\n",num1->one,num->one);
    return 0;
}

我知道另一种方式。为num1分配内存。将num的所有字段等同于num1,除了我想要更改的字段。还有其他办法吗?。

4 个答案:

答案 0 :(得分:2)

你有两个指针numnum1指向相同的结构。所以通过num更改结构也将改变num1指向的结构(因为它们指着同样的事情。)

 num = malloc(sizeof(Num));
 num1 = malloc(sizeof(Num));

现在numnum1指向不同的结构。

num->one=1;
num->two=2;
*num1 = *num;
num1->two = 3;

答案 1 :(得分:0)

您根本没有为num1创建内存。您只是在那里创建变量num的别名。如果不使用malloc或任何其他内存分配函数,则不能指望某个特定结构或对象的深层副本或克隆。试试这个。

num1=malloc(sizeof(Num));
memcpy (num1, num, sizeof (num1));

函数memcpy可帮助您克隆制作深拷贝的变量。memcpy的格式如下

memcpy(destination_var, source_var, sizeof (destination_var));

答案 2 :(得分:0)

您需要为每个num和num1分配单独的内存,以便在其中包含单独的值。 要避免malloc,只需声明如下变量并尝试代码

Num num;
Num num1;

num.one=1;
num.two=2;

num1=num;
num1.one=10;
//num1.two=2;

答案 3 :(得分:0)

请忘记到目前为止所说的一切,并且这样做:

num=malloc(sizeof(Num));
num1=malloc(sizeof(Num));

num->one=1;
num->two=2;

*num1 = *num; // copy all of the contents

num1->one=10; // change individual members if needed

...
free(num);
free(num1);