2

良い一日、

次のような単純な typedef がいくつかあります。

typedef int dataType;
typedef dataType* arrayOfNPointers[N];

したがって、dataTypeは を表しint、型はへのポインタarrayOfNPointersの配列を表します。Nint

次のように、これらの配列のいずれかの内容を別の配列に確実にディープ コピーできますか。

#define N (2)
arrayOfNPointers a1 = { 1, 2};
arrayOfNPointers a2;

a2 = a1;    // Safe?

このような構造体を直接コピーできることはわかっています。一般に、これをint*ポインターで割り当てようとすると、「浅いコピー」と見なされることもわかっています。

この場合、要素を含む 2 つの独立した固定サイズの配列になるの{1, 2}でしょうか?

ありがとうございました!

4

3 に答える 3

2

a2 = a1; // 安全?

いいえ、ステートメントはコンパイルさえしません。あなたのコンパイラは叫び始めます。

main.c: error: incompatible types when assigning to type 'arrayOfNPointers' from type 'dataType **'
于 2013-05-10T01:28:21.467 に答える
2

まず、次の点に注意してください。

arrayOfNPointers a1 = {1, 2};

私が知る限り、これはポインタを整数であるかのように初期化しています。これではうまく終わりません。(これについては後で詳しく説明します。)

とにかく:

安全?

いいえ。a1a2は両方とも配列です。これは、とりわけ、それらを割り当てることができないことを意味します。

   a2 = a1;
// ^^^^ WRONG

これ可能だったとしても (たとえば、それらがポインターである場合)、これは浅いコピーでさえありません。2 つの [私たちが装っている配列] ポインターは、同じメモリ ブロックを指します。[この方法でシャロー コピーできるのは構造体だけです。]

C で配列の適切なディープ コピーを実行するには、for ループを使用する必要があります。

for (int i = 0; i < N; ++i) {
  a2[i] = a1[i];
}

ただし、ポインターを扱っているため、上記は実際には浅いコピーとしてのみカウントされます。この配列を適切にディープコピーするには、もっと興味深いものが必要です。

for (int i = 0; i < N; ++i) {
  a2[i] = malloc(sizeof(int));
  *a2[i] = *a1[i];
}

しかし、何が問題なのarrayOfNPointers a1 = {1, 2};ですか?

多くの。{1, 2}指す整数を初期化していません。ポインタを初期化しています。

修正1

整数の配列:

typedef DataType arrayOfIntegers[N];
arrayOfIntegers a1 = {1, 2};

修正2

整数へのポインターの適切に初期化された配列:

DataType arr[N] = {1, 2};
arrayOfNPointers a1 = {&a[0], &a[1]};

または、malloced メモリを使用して後で割り当てる場合は、次のようにします。

arrayOfNPointers a1 = {NULL};

初期化子リストの規則により、すべてのポインターが最初は NULL であることが保証されます。

于 2013-05-10T01:24:11.907 に答える
2

いいえ、配列を別の配列に割り当てることはできません。arrayOfPointerstypeから typeに割り当てようとしているため、このコードはコンパイルされませんint**

より簡単な例を考えてみましょう:

int a1[3] = {1, 2, 3};
int a2[3];
a2 = a1;   // will not compile since you're trying to assigning to int[3] from int*

型が定義されていても

typedef int IntArray[3];
IntArray a1 = {1, 2, 3};
IntArray a2;
a2 = a1;

これはコンパイルされません。

于 2013-05-10T01:21:34.450 に答える