我想我在某处读过,当使用指针时,我们想要将一个指针的内容复制到另一个指针,有两个选项:
但是在下面的示例中,我只是通过为两个指针分配内存,然后分配第二个指针,首先更改..但是然后我的第二个指针的条目也在更改..我做错了什么来测试它:/.
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);
}
当您执行
bb = first;
操作时,bb
和 first
都指向内存的同一位置。 first->a = 55; first->b = 55; first->c = 89;
将更改该位置中 a
、b
和 c
的值。 first
的原始值仍然留在内存中,但无法再访问它。
我想你可能想做的是
*bb = *first;
。
您对
memcpy
的了解是正确的,但您不能仅通过像上面提到的语句中那样分配指针来分配“指针指向的位置”的内容。
您在以下语句中将一个指针分配给另一个指针:
bb = first;
现在这两个都指向相同的内存位置(将
bb
视为 first
的别名)。
如果你想复制数据,那么你可以使用“指针指向的数据”来复制
*bb = *first
正如已经指出的,如果你有一个指针
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
后,它们将各自包含指向内存中同一位置的指针的副本,但这些指针引用的数据不会被复制。因此,如果结构体包含指向数组的指针,则只会复制指针,而不复制数组的内容,数组的内容将由两个结构体共享。
您需要复制像
*p1 = *p2
这样的指针指向的数据。但请记住,如果您正在复制的结构中再次有指针,则这将不起作用。
如果处理 char *pointer,则有一个警告:
memcpy( dest, source, len) // copies the full string
*dest = *source // will copy ONLY the first char!