在C中复制指针'内容'的指针

时间:2012-11-07 00:17:41

标签: pointers malloc free

我在复制指针内容时遇到了一些麻烦。我只想这样做:

 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 没有任何价值。我想我必须指向< em> vigia2 到 aux 所在的内存区域, free 之后“消失”的区域。所以我该怎么做? 谢谢!

3 个答案:

答案 0 :(得分:5)

指针,指针,对他们不好,没有他们就更糟糕

指针是一个存储内存存储位置的数字,记住这一点,让我们深入研究你在那里所做的事情:

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

很好,你在内存的某个部分创建了一个名为 heap 的空间,并将新创建的内存空间的地址存储在aux。

aux=vigia1;

Ops,现在你已经使用存储在vigia1的号码覆盖了你“创建”的内存空间的地址,这个地址恰好是另一个内存空间的地址。

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

答案 1 :(得分:3)

将一个指针指向另一个指针只是将一个指针的值复制到另一个指针,即地址。它不会将指针引用的内容复制到另一个地址的另一个位置。所以是的,你可以让N个指针都指向同一块内存,但是一旦free()被调用,其中一个就完全无效了。

这意味着:

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

是内存泄漏。 mallocaux留下了一些内存,然后立即丢弃了该地址。没有办法让它回来,再也不能free()了。

答案 2 :(得分:1)

您所做的只是指针分配。 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);

希望这能给你提示。