gpt4 book ai didi

c memcpy 按值结构

转载 作者:行者123 更新时间:2023-12-04 09:37:23 27 4
gpt4 key购买 nike

我只是想将一个结构复制到另一个结构(按值复制,而不是按引用复制)。这是完整的工作代码

/* memcpy example */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define SIZE (80*sizeof(char))

typedef struct {
char* name;
} person;

int main ()
{
person p1;
p1.name = (char*) malloc( SIZE );

person p2;
p2.name = (char*) malloc( SIZE );

// set p1
strcpy(p1.name, "John");

// copy p1 > p2
memcpy ( &p2, &p1, SIZE );

printf ("p1.name: %s (%u)\n", p1.name, &p1.name );
printf ("p2.name: %s (%u)\n", p2.name, &p2.name );

// change p1 only
printf("Changing p1.name\n");
strcpy(p1.name, "ONLY p1.name Changed");

// now, why did p2 change?
printf ("p1.name: %s (%u)\n", p1.name, &p1.name );
printf ("p2.name: %s (%u)\n", p2.name, &p2.name );

free(p1.name);
free(p2.name);

return 0;
}

这是一个 fiddle http://cpp.sh/57skb

该代码输出

p1.name: John (0x791b3cdd6270)
p2.name: John (0x791b3cdd6280)
Changing p1.name
p1.name: ONLY p1.name Changed (0x791b3cdd6270)
p2.name: ONLY p1.name Changed (0x791b3cdd6280)

预期的输出是

p1.name: John (0x791b3cdd6270)
p2.name: John (0x791b3cdd6280)
Changing p1.name
p1.name: ONLY p1.name Changed (0x791b3cdd6270)
p2.name: John (0x791b3cdd6280)

问题:p2为什么会变?

请注意,在没有结构的情况下做同样的事情会按预期工作: http://cpp.sh/6qevd

最佳答案

当你制作那个副本时,两个结构 name 成员将具有相同的值,因此它们指向相同的内存位置。您的代码没有显示这一点,因为您没有正确打印指针值。试试这个,看看他们确实是一样的

  printf ("p1.name: %s (%p)\n", p1.name, p1.name );
printf ("p2.name: %s (%p)\n", p2.name, p2.name );

输出

p1.name: John (0x3ee8d60)
p2.name: John (0x3ee8d60)

p2strcpy(p1.name, "ONLY p1.name Changed"); 之后没有改变。只需 p2.name 也指向这个新字符串。

关于c memcpy 按值结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60705618/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com