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

C 将一个指针内容复制到另一个指针内容,c,pointers,C,Pointers,我想我在某个地方读到过,当使用指针时,我们想要将一个指针的内容复制到另一个指针时,有两种选择: 使用memcpy或 只是给它们赋值= 然而,在下面的例子中,我只是通过为两个指针分配内存,然后分配第二个指针,首先更改..但是我的第二个指针的条目也在更改。。我做错了什么:/ typedef struct { int a; int b; int c; } my_struct; int main(int argc, char** argv) { my_stru

我想我在某个地方读到过,当使用指针时,我们想要将一个指针的内容复制到另一个指针时,有两种选择:

  • 使用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);
}

您对
memcpy
的了解是正确的,但您不能像在上述语句中那样通过分配指针来分配“指针指向的位置”的内容

在以下语句中,将一个指针指定给另一个指针:

bb = first;
现在这两个都指向相同的内存位置(将
bb
看作
first
的别名)


如果您想要复制数据,那么您可以使用“指针指向的数据”
*bb=*first
在您执行
bb=first时进行复制
bb
first
都指向相同的内存位置<代码>第一->a=55;第一->b=55;第一->c=89将更改该位置中
a
b
c
的值。
first
的原始值仍保留在内存中,但无法再访问它


我想你可能想做的是先
*bb=*

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

如果定义数组
A
,则无法进行赋值
B=A
以将
A
的内容复制到
B
。必须使用
strcpy()
memcpy()
或类似函数。但是结构是不同的。可以将一个结构的内容分配给兼容的结构

在您的示例中,
bb
first
是指向结构的指针,当您编写
bb=first
时,现在这两个指针引用内存中的同一地址,并且您不再能够访问最初由
bb
引用的内存--因此,现在出现内存泄漏!但是
*bb
*first
是结构,当您编写
*bb=*first
时,结构
*first
的内容会复制到结构
*bb
。现在,在内存中的不同位置有两个不同的结构,每个结构都有相同三个
int
s的副本


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

Ok,因此在这些情况下无法使用memcpy?@malayedala
*bb=*first好的,非常感谢您的解释,它使它更清楚了一点。。但是C语言中关于内容复制的约定是什么?memcpy更常见还是你写的作业更常见?我认为这本身并没有约定。这实际上取决于场景,因为复制涉及指针的数据是一个非常高级的主题,IMO。因此,对于
*指针=*其他指针
,我始终保证
其他指针
后面的内容会复制到
指针
的位置?