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。因此,对于*指针=*其他指针
,我始终保证其他指针
后面的内容会复制到指针
的位置?