我以为自己已经阅读了某些地方,当使用指针并且我们想要将一个内容复制到另一个时,有两个选项:
然而在下面的例子中,我只是通过为两个指针分配内存来测试它,然后分配第二个,先改变..然后我的第二个指针的输入也在改变。我做错了什么:/。
typedef struct {
int a;
int b;
int c;
} my_struct;
int main(int argc, char** argv) {
my_struct* first = malloc(sizeof(my_struct));
first->a = 100; first->b = 101; first->c = 1000;
my_struct* bb = malloc(sizeof(my_struct));
printf("first %d %d %d\n", first->a, first->b, first->c);
bb = first;
printf("second %d %d %d\n", bb->a, first->b, bb->c);
first->a = 55; first->b = 55; first->c = 89;
printf("second %d %d %d\n", bb->a, first->b, bb->c);
}
答案 0 :(得分:14)
您执行bb = first;
,bb
和first
的那一刻指向内存的相同位置。 first->a = 55; first->b = 55; first->c = 89;
会更改该位置的a
,b
和c
的值。 first
的原始值仍然在记忆中挥之不去,但无法再访问它了。
我认为你可能想做的是*bb = *first;
。
答案 1 :(得分:6)
您对memcpy
的了解是正确的,但您无法通过指定上述语句中的指针来指定“指针指向的位置”的内容。
您将在以下语句中为另一个指定一个指针:
bb = first;
现在这两个指向相同的内存位置(将bb
视为first
的别名)。
如果您要复制数据,请使用“指针指向的数据”*bb = *first
答案 2 :(得分:2)
正如已经指出的那样,如果指针first
指向内存中的某个位置,并且您进行了作业bb
= first
,其中{{1} }是兼容的指针类型,然后bb
指向与bb
相同的地址。这不会将first
引用的内存的内容复制到first
最初引用的位置。它将指针的值(即地址)复制到bb
。
如果您定义了数组bb
,则无法将作业A
复制到B = A
的内容到A
。您必须使用B
或strcpy()
或某些此类功能。但结构是不同的。您可以将一个结构的内容分配给兼容的结构。
在您的示例中,memcpy()
和bb
是指向结构的指针,当您编写first
时,现在两个指针都引用内存中的相同地址,并且您无法再访问最初由bb = first
引用的内存 - 所以现在你有内存泄漏!但bb
和*bb
是结构,当您编写*first
时,结构*bb = *first
的内容将复制到结构*first
。所以现在你有两个不同的结构,在内存中的不同位置,每个结构都有相同的三个*bb
的副本。
如果int
类型包含指向my_struct
的指针,则在赋值int
之后,它们每个都包含指向内存中相同位置的指针的副本,但引用的数据通过那些指针不会被复制。因此,如果结构包含指向数组的指针,则只复制指针,而不是数组的内容,这两个结构将共享。
答案 3 :(得分:0)
你需要复制*p1 = *p2
之类的指针指向的数据。但是请记住,如果您正在复制的结构中再次有指针,这将不起作用。