まず、次の点に注意してください。
arrayOfNPointers a1 = {1, 2};
私が知る限り、これはポインタを整数であるかのように初期化しています。これではうまく終わりません。(これについては後で詳しく説明します。)
とにかく:
安全?
いいえ。a1
とa2
は両方とも配列です。これは、とりわけ、それらを割り当てることができないことを意味します。
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]};
または、malloc
ed メモリを使用して後で割り当てる場合は、次のようにします。
arrayOfNPointers a1 = {NULL};
初期化子リストの規則により、すべてのポインターが最初は NULL であることが保証されます。