【问题标题】:Copying pointers to pointers 'contents' in C将指针复制到 C 中的指针“内容”
【发布时间】:2012-11-07 00:17:40
【问题描述】:

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

 char* vigia1; 
 char* vigia2;

还有..

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

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

由于我正在尝试对列表进行排序,因此我需要进行此更改以对节点的内容进行排序。但我很困惑:free(aux) 之后,vigia2 没有任何价值。我想我一定是在指出 vigia2 到 aux 所在的内存区域,在 free 之后“消失”的区域。所以我该怎么做? 谢谢!

【问题讨论】:

    标签: pointers malloc free


    【解决方案1】:

    指针,指针,有它们不好,没有它们更糟

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

    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 */
    

    【讨论】:

    • 我真的把这个概念搞砸了。非常感谢您的详细回答!了解指针基本上是一个内存地址,我解决了它,将那些指针指向的内存地址保存到一个双精度(双辅助;)中。我不知道这是否是正确的方法,但到目前为止它工作得很好。我真的很容易被指针弄糊涂!!
    • 很高兴它有帮助。一开始很容易与指针混淆,但你已经习惯了;)不过,只有一个问题:为什么在没有任何评论解释如何以及为什么可以改进答案的情况下投反对票?
    • 对不起,我刚刚读了。我没有对任何答案投反对票!我是这个网站的新手。我注意到的是,其他答案现在是“0”票,我对每一个都投了赞成票,因为所有人都有帮助。也许我不允许全部投票并且有人改变了它?我真的不知道。
    【解决方案2】:

    将一个指针分配给另一个指针只是将一个指针的值复制到另一个指针,即地址。它不会将指针所指的内容复制到不同地址的另一个位置。所以是的,你可以让 N 个指针都指向同一个内存块,但是一旦 free() 被称为其中之一,它们都是无效的。

    这意味着:

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

    是内存泄漏。您mallocaux 分配了一些内存,然后立即丢弃了该地址。没有办法找回它,再也没有办法free()它了。

    【讨论】:

    • 优秀。你也真的帮了我。
    • 这里也一样。我全都赞成!事实上,向上箭头现在是橙色的,上面写着“答案很有用(点击撤消)”也许是版主改变了它?我不知道它会是什么,我是该网站的新手。如果我现在再次点击,它不会让我投票(你最后一次投票给这个答案 Nov7....)。很抱歉造成误解。
    【解决方案3】:

    您所做的只是指针分配。 Malloc 的内存只是被浪费导致泄漏。

    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);
    

    希望这能给你提示。

    【讨论】:

    • 我认为你也遇到了同样的情况。如果您收到我的反对票:我支持每个答案!因为你帮了我所有人。事实上,向上箭头现在是橙色的,上面写着“答案很有用(点击撤消)”也许是版主更改了它。我不知道它会是什么,我是该网站的新手。很抱歉造成误解。
    • @LeanDroid 没问题。很高兴我的回答对您有所帮助。
    猜你喜欢
    • 2011-04-09
    • 2013-01-08
    • 1970-01-01
    • 2019-02-22
    • 2020-02-26
    • 2010-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多