我在两个代码中做同样的事情。
在代码1中:我使用char *
并使用malloc
中的main
分配空格。
在代码2中:我为了相同的目的使用了char
数组。但为什么输出会有所不同?
代码1:
struct node2
{
int data;
char p[10];
}a,b;
main()
{
a.data = 1;
strcpy(a.p,"stack");
b = a;
printf("%d %s\n",b.data,b.p); // output 1 stack
strcpy(b.p,"overflow");
printf("%d %s\n",b.data,b.p); // output 1 overflow
printf("%d %s\n",a.data,a.p); // output 1 stack
}
代码2:
struct node1
{
int data;
char *p;
}a,b;
main()
{
a.data = 1;
a.p = malloc(100);
strcpy(a.p,"stack");
b = a;
printf("%d %s\n",b.data,b.p); //output 1 stack
strcpy(b.p,"overflow");
printf("%d %s\n",b.data,b.p); // output 1 overflow
printf("%d %s\n",a.data,a.p); // output 1 overflow(why not same as previous one?)
}
答案 0 :(得分:10)
在第二个示例中,您将a
分配给b
,这意味着a.p
(char*
)正在分配给b.p
。因此,修改b.p
指向的内存也会修改a.p
指向的内存,因为它们都指向内存中的相同位置。
在第一个示例中,您有两个单独的数组。将a
分配给b
将数组char
中的每个a.p
复制到b.p
- 这些内存块是struct
的一部分{1}},它们不是指向内存中特定部分的指针。在这种情况下对b.p
的任何修改都不会影响a.p
,因为它们完全不相关。
答案 1 :(得分:3)
字符指针和字符数组不是一回事。
您的阵列节点正在被复制,因此内容将被复制到新节点中。将新值(溢出)放入复制的节点(b)时,它只会覆盖副本。
带有字符指针的节点正在复制指针的值,因此两个节点都指向相同的内存位置。当您将新值(溢出)放入复制的节点(b)时,它会将两个节点都指向的内存写入内存。
答案 2 :(得分:3)
在你的第一个代码中,struct包含一个实际的字符数组(char[10]
),因此当你复制struct(b = a
)时,数组也会被复制。然后你覆盖其中一个而不是另一个。
在第二个代码中,struct包含一个指向字符的指针,因此在复制struct时,指针会被复制,但数据却不是。所以两者都指向相同的数据。