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

问题描述 投票:0回答:5

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

  • 使用 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);
}
c pointers
5个回答
34
投票

当您执行

bb = first;
操作时,
bb
first
都指向内存的同一位置。
first->a = 55; first->b = 55; first->c = 89;
将更改该位置中
a
b
c
的值。
first
的原始值仍然留在内存中,但无法再访问它。

我想你可能想做的是

*bb = *first;


13
投票

您对

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

您在以下语句中将一个指针分配给另一个指针:

bb = first;

现在这两个都指向相同的内存位置(将

bb
视为
first
的别名)。

如果你想复制数据,那么你可以使用“指针指向的数据”来复制

*bb = *first


5
投票

正如已经指出的,如果你有一个指针

first
指向内存中的某个位置,并且你进行赋值
bb
=
first
,其中
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
的指针,那么在赋值
*bb = *first
后,它们将各自包含指向内存中同一位置的指针的副本,但这些指针引用的数据不会被复制。因此,如果结构体包含指向数组的指针,则只会复制指针,而不复制数组的内容,数组的内容将由两个结构体共享。


0
投票

您需要复制像

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


0
投票

如果处理 char *pointer,则有一个警告:

memcpy( dest, source, len) // copies the full string

*dest = *source // will copy ONLY the first char!
© www.soinside.com 2019 - 2024. All rights reserved.