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

ポインター、ポインター、あるとダメ、ないとダメ

ポインターは、メモリ内のどこに sth が格納されているかを格納する数値です。

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

よし、 heapと呼ばれるメモリの一部に領域を作成し、新しく作成されたメモリ領域のアドレスを aux に保存しました。

aux=vigia1;

これで、「作成」したメモリ空間のアドレスが vigia1 に保存されている番号で上書きされました。これはたまたま別のメモリ空間へのアドレスです。

vigia1=vigia2;

ここで、vigia1 に vigia2 の値を代入しています。これは、そこにあるメモリ空間の別のアドレスです。

vigia2=aux;

そして最後に、vigia1 が以前に指していたメモリ領域を vigia2 が指すようにします。

free (aux);

ここで、aux が指すメモリを解放しています。ちょっと待ってください。この行の上の行で、vigia2 が同じアドレスを指すようにしました。何も役に立たないのも不思議ではありません:)

あなたがやりたいことを手伝おうとしています:

リスト ノードをメモリ内で順序付けする必要があるという制約がない限り、ノードの内容をコピーする必要はありません。最初のノードのポインタを 2 番目のノードのメモリ領域を指すようにするだけです。ノード。

完全なスワップは次のようになります。

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()そのうちの 1 つが呼び出されると、それらはすべて無効になります。

つまり、これは次のことを意味します。

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 に答える