我将两个结构等同于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,除了我想要更改的字段。还有其他办法吗?。
答案 0 :(得分:2)
你有两个指针num
和num1
指向相同的结构。所以通过num
更改结构也将改变num1
指向的结构(因为它们指着同样的事情。)
num = malloc(sizeof(Num));
num1 = malloc(sizeof(Num));
现在num
和num1
指向不同的结构。
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);