我以为我读过某个地方,当使用指针并且我们想要将一个内容复制到另一个时,有两个选项:
然而在下面的例子中,我只是通过为两个指针分配内存来测试它,然后分配第二个,先改变..然后我的第二个指针的输入也在改变.我做错了什么:/.
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;,bb并first指向相同的记忆位置.first->a = 55; first->b = 55; first->c = 89;将改变值a,b以及c在该位置.原来的价值first仍然在记忆中挥之不去,但再也无法访问它了.
我想你可能想做的是*bb = *first;.
您的知识memcpy是正确的,但您不能仅仅通过指定上面提到的语句中的指针来指定"指针指向的位置 "的内容.
您将在以下语句中为另一个指定一个指针:
bb = first;
Run Code Online (Sandbox Code Playgroud)
现在这两个指向相同的内存位置(想bb作别名first).
如果要复制的数据,然后复制使用" 指向的数据指针 "*bb = *first
正如已经指出的,如果您有一个指向first内存中某个位置的指针,并且您进行赋值bb= first,其中bb是兼容的指针类型,则bb指向与 相同的地址first。这不会将 引用的内存内容复制first到 最初引用的位置bb。它将指针的值(即地址)复制到bb。
如果定义数组A,则无法进行赋值以复制toB = A的内容。您必须使用or或者 一些这样的函数。但结构不同。您可以将一个结构体的内容分配给兼容的结构体。ABstrcpy()memcpy()
在您的示例中,bb和first是指向结构的指针,当您写入 时bb = first,现在两个指针都引用内存中的同一地址,并且您不再有权访问最初引用的内存bb- 所以现在您有内存泄漏!但是*bb和*first是结构体,当您写入 时*bb = *first, struct 的内容*first将被复制到 struct *bb。所以现在你有两个不同的结构,位于内存的不同位置,每个结构都有相同的三个int结构的副本。
如果您的my_struct类型包含指向 的指针int,则在赋值后,*bb = *first它们将各自包含指向内存中同一位置的指针的副本,但这些指针引用的数据不会被复制。因此,如果结构包含指向数组的指针,则只会复制指针,而不复制数组的内容,数组的内容将由两个结构共享。