Pointers 将指针复制到指针';目录';在C中

Pointers 将指针复制到指针';目录';在C中,pointers,malloc,free,Pointers,Malloc,Free,我在复制指针的内容时遇到了一些问题。我只是想尝试一下: char* vigia1; char* vigia2; 和 vigia1、vigia2是指向char指针的指针。它们的malloc都大于它们的最大可能大小,这没关系 由于我试图对列表进行排序,因此需要进行此更改以对节点的内容进行排序。但我感到困惑:在空闲(aux)之后,vigia2没有任何值。我想我必须将vigia2指向aux所在的内存区域,即空闲之后“消失”的区域。那我该怎么办? 谢谢 您所做的只是指针赋值。Malloc'ed内存

我在复制指针的内容时遇到了一些问题。我只是想尝试一下:

 char* vigia1; 
 char* vigia2;

vigia1、vigia2是指向char指针的指针。它们的malloc都大于它们的最大可能大小,这没关系

由于我试图对列表进行排序,因此需要进行此更改以对节点的内容进行排序。但我感到困惑:在空闲(aux)之后,vigia2没有任何值。我想我必须将vigia2指向aux所在的内存区域,即空闲之后“消失”的区域。那我该怎么办?
谢谢

您所做的只是指针赋值。Malloc'ed内存正在浪费,导致泄漏

aux=vigia1; // Makes aux point to the location where vigia1 is pointing to
            // Doesn't copy the contents of vigia1 to malloc'ed memory for aux
您需要使用strcpy进行深度复制

strcpy(aux, vigia1);

希望这能给您一些提示。

将一个指针分配给另一个指针只需将一个指针的值复制到另一个指针,即地址。它不会将指针引用的内容复制到不同地址的另一个位置。是的,可以有N个指针都指向同一块内存,但是一旦调用了
free()
,它们都是无效的

这意味着:

char* aux = (char*) malloc (strlen (vigia1)+1);
aux=vigia1;

是内存泄漏。您
malloc
aux
分配了一些内存,然后立即丢弃了地址。没有办法找回它,也没有办法再释放它。

指针,指针,它们坏了,没有它们更糟

指针是一个数字,它存储在内存中某物的存储位置。考虑到这一点,让我们深入研究一下您在那里做了什么:

char* aux = (char*) malloc (strlen (vigia1)+1);
很好,您已经在名为heap的内存部分的某处创建了空间,并将新创建的内存空间的地址存储在aux

aux=vigia1;
Ops,现在您已经用存储在vigia1的数字覆盖了您“创建”的内存空间的地址,这恰好是另一个内存空间的地址

vigia1=vigia2;
现在您将vigia2的值分配给vigia1,这是另一个内存空间的地址

vigia2=aux;
最后,让vigia2指向之前由vigia1指向的内存区域

free (aux);
现在,您正在释放aux指向的内存。等一下,在这上面的线上,你刚刚把vigia2指向了同一个地址。难怪它没有什么用处:)

试图帮助您完成您想做的事情:

只要没有任何约束要求您在内存中对列表节点进行排序,就不需要复制节点的内容,只需将第一个节点的指针指向第二个节点的内存区域即可

完美的互换是:

char *aux; // you'll need an aux to make the swap, the normal stuff
aux = vigia1; // now aux points to the same address as vigia1
vigia1 = vigia2; // vigia1 now points to the contents of vigia2
vigia2 = aux; // and now vigia2 points to the content pointed previously by vigia1
/* and tada! the swap is done :D */

我真的把这个概念搞砸了。非常感谢您的详细回答!理解到指针基本上是一个内存地址,我解决了这个问题,将指针指向的内存地址保存到一个double(double aux;)中。我不知道这样做是否正确,但到目前为止效果很好。我真的很容易被指针弄糊涂!!很高兴这有帮助。一开始很容易被指针弄糊涂,但你已经习惯了;)不过,只有一个问题:为什么没有任何解释如何以及为什么可以改进答案的评论就投了否决票?对不起,我刚刚读到了。我没有否决任何答案!我是这个网站的新手。我注意到其他答案现在都是“0”票,我对每一个都投了更高的票,因为所有答案都起到了作用。也许我不被允许投票,但有人改变了?我真的不知道,太好了。你真的也帮了我,我也是。我投了所有人的票!事实上,现在向上的箭头是橙色的,上面写着“答案很有用(点击撤销)”,也许是版主改变了它?我不知道会是什么,我是新来的。如果我现在再次点击,它不会让我投票(你上一次投票是在11月7日)。对不起,误会了。我想你也一样。如果你收到我的反对票:我对每个答案都投了赞成票!因为你帮了我所有人。事实上,现在向上的箭头是橙色的,上面写着“答案很有用(点击撤销)”,也许是版主改变了它。我不知道会是什么,我是新来的。抱歉误会了。@LeanDroid没问题。很高兴我的回答对你有所帮助。
char *aux; // you'll need an aux to make the swap, the normal stuff
aux = vigia1; // now aux points to the same address as vigia1
vigia1 = vigia2; // vigia1 now points to the contents of vigia2
vigia2 = aux; // and now vigia2 points to the content pointed previously by vigia1
/* and tada! the swap is done :D */