0

私は現在 C でプログラミングしており、ポインターの配列を作成しています。配列に含まれるこれらのポインターは、プログラム全体の期間中持続します。

ポインターの配列が配列 A だとします。次に、別のポインターの配列 B を作成し、配列 A の要素を配列 B に入れます。次に、配列 A を解放します。

配列 B の要素はどうなりますか? 配列 A が解放されてから有効でなくなるのでしょうか、それとも、実際のポインタがメモリ内でまだ有効であるため、配列 A は有効でしょうか?

ありがとう

これが私のコードがどのように見えるかの例です--

int a = 1;
int b = 2;
int c = 3;

int **array_a = (int **) malloc (sizeof (int *) * 3);
array_a[0] = &a;
array_a[1] = &b;
array_a[2] = &c;

int **array_b = (int **) malloc (sizeof (int *) * 1);
array_b[0] = array_a[0];
free(array_a);

では、array_b[0] はどうなるでしょうか。

4

5 に答える 5

2

こうすれば

int *a = malloc(10 * sizeof(int));
for (int i = 0 ; i != 10 ; i++) {
    a[i] = 2*i+1;
}
int *b = a;
free(a);

その後bも無効になります。

ただし、これを行うと、

int *a = malloc(10 * sizeof(int));
for (int i = 0 ; i != 10 ; i++) {
    a[i] = 2*i+1;
}
int *b = malloc(10 * sizeof(int));
memcpy(b, a, 10 * sizeof(int));
free(a);

その後bは有効のままです。

于 2013-11-13T03:15:19.737 に答える
-1

C は配列を基本要素のアドレスとして解釈するため、配列を解放した方法によっては、要素をまったく解放していない可能性があります。

ただし、配列のすべての要素を解放したと仮定すると、配列 B のポインターは引き続き存在します (メモリ内の同じ場所を指しているままです)。ただし、その場所のメモリは既に解放しているため、その場所に何があるかはわかりません。そこに元のデータが保存されているか、上書きされている可能性があります。ただし、それを使用するのは間違いなく安全ではありません。

于 2013-11-13T03:16:38.017 に答える