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

mal*_*ala 11 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);
}
Run Code Online (Sandbox Code Playgroud)

Anz*_*rio 16

你做的那一刻bb = first;,bbfirst指向相同的记忆位置.first->a = 55; first->b = 55; first->c = 89;将改变值a,b以及c在该位置.原来的价值first仍然在记忆中挥之不去,但再也无法访问它了.

我想你可能想做的是*bb = *first;.


Pno*_*tNP 7

您的知识memcpy是正确的,但您不能仅仅通过指定上面提到的语句中的指针来指定"指针指向的位置 "的内容.

您将在以下语句中为另一个指定一个指针:

bb = first;
Run Code Online (Sandbox Code Playgroud)

现在这两个指向相同的内存位置(想bb作别名first).

如果要复制的数据,然后复制使用" 指向的数据指针 "*bb = *first

  • @malajedala `*bb = *first;` (2认同)

ex *_*ilo 5

正如已经指出的,如果您有一个指向first内存中某个位置的指针,并且您进行赋值bb= first,其中bb是兼容的指针类型,则bb指向与 相同的地址first。这不会将 引用的内存内容复制first到 最初引用的位置bb。它将指针的值(即地址)复制到bb

如果定义数组A,则无法进行赋值以复制toB = A的内容。您必须使用or或者 一些这样的函数。但结构不同。您可以将一个结构体的内容分配给兼容的结构体。ABstrcpy()memcpy()

在您的示例中,bbfirst是指向结构的指针,当您写入 时bb = first,现在两个指针都引用内存中的同一地址,并且您不再有权访问最初引用的内存bb- 所以现在您有内存泄漏!但是*bb*first是结构体,当您写入 时*bb = *first, struct 的内容*first将被复制到 struct *bb。所以现在你有两个不同的结构,位于内存的不同位置,每个结构都有相同的三个int结构的副本。

如果您的my_struct类型包含指向 的指针int,则在赋值后,*bb = *first它们将各自包含指向内存中同一位置的指针的副本,但这些指针引用的数据不会被复制。因此,如果结构包含指向数组的指针,则只会复制指针,而不复制数组的内容,数组的内容将由两个结构共享。