3

私はこのコードが何をするのかを理解しようとしています(そしてそれが許可されているかどうか):

int * A;
int * B;
A = (int *)malloc( size_t somenumber );
B = A;

// bunch of stuff using B, B++, etc.

私が読んだものはすべて、参照演算子 ( &) または逆参照演算子 ( ) のいずれかを使用して、物事をポインターと同等にすることを常に示しています*

この種の等式化は何をしますか?

そして、最終的にはfree(A)どうなりBますか?

4

6 に答える 6

8

これは 2 つのポインターを同一視するのではなく、ポインターの代入です。一度

B = A;

が実行されると、両方のポインターがメモリの同じ領域を指し*Bます。*AB[i]A[i]

解放するとdanglingAが解放され、その逆も同様であることに注意してください。つまり、呼び出した後B

free(A);

アクセスする*Bと未定義の動作になります。

于 2012-10-19T13:15:19.750 に答える
7

ポインターの混乱に関しては、写真は常に良いです。

int * A; // create a pointer to an int named "A"
int * B; // create a pointer to an int named "B"
A = (int *)malloc( size_t somenumber ); // Allocate A some memory, now B is an 
                                        // uninitialized pointer; A is initialized,
                                        // but just to uninitialized memory

概念的に:

ここに画像の説明を入力

B = A; // Assign B to the value of A (The uninitialized memory)

ここに画像の説明を入力

free(A);

ここに画像の説明を入力

結局のところ、何が起こっているのかを見ることができると思います。B には、割り当てられた初期化されていないメモリ チャンクである A の値が割り当てられています。これで、同じ領域を指している 2 つのポインターができました。

質問に関しては、free()呼び出したときにわかるようにfree(A);、A と B の両方が同じ領域を指しているままになり、プログラムには何も割り当てられていません。これが、呼び出し時にfree()ポインターを に設定するのが良い理由NULLです。

最初の質問に戻ります。2 つのポインターを確認したい場合==:

int * A; // create a pointer to an int named "A"
int * B; // create a pointer to an int named "B"
A = (int *)malloc( size_t somenumber ); // Allocate A some memory, now B is an 
                                        // uninitialized pointer; A is initialized,
                                        // but just to uninitialized memory

if(B == A){
   // The pointers are pointing to the same thing!
}
if(*B == *A){
   // The values these pointers are pointing to is the same!
}

更新
更新された質問に答えるには、 の定義を変更する必要がありBます。

int *A;  // A is a pointer to an int
int **B; // B is a pointer to a pointer to an int
B = &A;  // B is now pointing to A

それを説明するために:

ここに画像の説明を入力

の場合B=*A:

int *A;
int B;
A = malloc(sizeof(int));
*A = 5;
B = *A;

これは の順守ですA。したがって、 A が指しているものを何でも取り、それを に割り当てるだけです。Bこの場合は 5

于 2012-10-19T14:07:38.283 に答える
2

上記の場合、free(A)ポインタAが指すメモリブロック(ポインタBも同じブロックを指す)が解放され、リソースがシステムに返されます。AまたはBに格納されているアドレスは引き続き存在します(これをダングリングポインタと呼びます。これは、メモリブロックの以前の場所を指すポインタです)。通常、呼び出し後にNULLに設定しますfree()。少なくとも、最近のOSでは、後でポインタを誤って参照しようとすると、システムがSIGSEGVとコアダンプを通知します。そうしないと、ポインタが指す同じアドレスが何らかの形で再び割り当てられたときに、プログラムが奇妙な動作(クラッシュ、続行、バグのある出力)を表示する可能性があります。

于 2012-10-19T13:21:26.650 に答える
2

これは「等化」ではありません。それが何を意味するにせよ、これは単なる代入です。pointerAの値 (先ほど割り当てたメモリ ブロックのアドレス) が pointer にコピーされますB

すると、「ダングリング ポインター」と呼ばれるもの、つまり使用できなくなったポインターになりますfree(A)B

于 2012-10-19T13:15:37.573 に答える
2

あるポインターを別のポインターに割り当てているだけです。今、指していたものはB何でもA指します。解放Aすると、それも解放されますB(1 回しか発生しないため、これをどのように表現すればよいかわかりませんfree)。については、&おそらく次のことを意味します。

int *A;
int B;
A = &B;

つまり、ポインターAが整数を指すようにするBか、またはストアBのアドレスを in にしAます。

于 2012-10-19T13:15:53.080 に答える
2

これは、2 つのポインタが同じメモリ アドレスを指すように設定するだけです。

それらのいずれかが後で別のアドレスを指すように変更された場合、これはもう一方に影響しませんが、指す値を逆参照して変更すると、もちろん他のポインターからも表示されます。

ポインターの 1 つが解放されると、もう一方のコピーはすぐに逆参照できなくなります (割り当て後に同じ値を保持していると仮定します)。

そのようなコードを書く実際的な理由は、プログラムの実行中に割り当てられた範囲内を移動するA間、割り当てられたメモリの開始時に「固定」されたままであると思われることです。Bメモリを解放する必要がありますがA(おそらくベースラインとして)、何らかの理由でそのメモリへの別の「一時的な」ポインタを使用する方が便利です。

于 2012-10-19T13:16:02.470 に答える