将一个指针内容复制到另一个

时间:2016-10-09 00:03:49

标签: c pointers

我以为自己已经阅读了某些地方,当使用指针并且我们想要将一个内容复制到另一个时,有两个选项:

  • 使用memcpy或
  • 只需用=?
  • 指定它们

然而在下面的例子中,我只是通过为两个指针分配内存来测试它,然后分配第二个,先改变..然后我的第二个指针的输入也在改变。我做错了什么:/。

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);
}

4 个答案:

答案 0 :(得分:14)

您执行bb = first;bbfirst的那一刻指向内存的相同位置。 first->a = 55; first->b = 55; first->c = 89;会更改该位置的abc的值。 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。您必须使用Bstrcpy()或某些此类功能。但结构是不同的。您可以将一个结构的内容分配给兼容的结构。

在您的示例中,memcpy()bb是指向结构的指针,当您编写first时,现在两个指针都引用内存中的相同地址,并且您无法再访问最初由bb = first引用的内存 - 所以现在你有内存泄漏!但bb*bb是结构,当您编写*first时,结构*bb = *first的内容将复制到结构*first。所以现在你有两个不同的结构,在内存中的不同位置,每个结构都有相同的三个*bb的副本。

如果int类型包含指向my_struct的指针,则在赋值int之后,它们每个都包含指向内存中相同位置的指针的副本,但引用的数据通过那些指针不会被复制。因此,如果结构包含指向数组的指针,则只复制指针,而不是数组的内容,这两个结构将共享。

答案 3 :(得分:0)

你需要复制*p1 = *p2之类的指针指向的数据。但是请记住,如果您正在复制的结构中再次有指针,这将不起作用。