2

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

 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之后“消失” 。所以我该怎么做?谢谢!

4

3 回答 3

5

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

指针是存储某物在内存中的存储位置的数字,考虑到这一点,让我们深入研究您在那里所做的事情:

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

很好,您已经在称为heap的内存的某处创建了空间,并将新创建的内存空间的地址存储在 aux 中。

aux=vigia1;

操作,现在您已经用存储在 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 */
于 2012-11-07T00:27:13.487 回答
3

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

所以这意味着:

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

是内存泄漏。您malloc需要一些内存aux,然后立即丢弃该地址。没有办法找回它,再也没有办法找回它free()

于 2012-11-07T00:25:18.797 回答
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);

希望这能给你提示。

于 2012-11-07T00:23:47.437 回答