1

関連スレッドはこちら: C99 は配列が連続していることを保証しますか?

以下では明らかanswer()に有効ではありませんが、char * を使用するか、int[nElements] にキャストするように書き直すことができます (おそらく)。標準参照が理解できないことと、適切に配置されている場合に int* を介して連続する int ブロックにアクセスできない理由を理解していないことを認めます。

まず、次のコード ブロックはほとんどの C++ プラットフォームで有効ですか?

void answer(int *pData, size_t nElements)
{
    for( size_t i=0; i<nElements; ++i )
        pData[i] = 42;
}

void random_code()
{
    int arr1[1][2][3][4];               // local allocation
    answer(arr1, sizeof(arr1) / sizeof(int));
    int arr2[20][15];
    answer(arr2, sizeof(arr2) / sizeof(int));
}

2 番目はanswer()、すべての割り当てタイプ (グローバル、ローカル、ヒープ (願わくば正しい!)) で引き続き有効ですか?

int g_arr[20][15]; // global
void foo() {
    int (*pData)[10] = new int[50][10];  // heap allocation, at least partially
    answer(&pData[0][0], 50*10);
    // not even sure if delete[] will free pData correctly, but...
}
4

3 に答える 3

1

はい、ほとんどのプラットフォームは実際に、最初の要素へのポインターでの線形アドレス指定がすべての要素を見つけるような方法で、N 次元配列の要素をパックします。

配列の配列は上記の配列をパックする必要あり、配列の配列のサイズは各サブ配列に配列の配列の数を掛けます。それが機能しない余地はないようです。各要素の順序も明確に定義されているようです。

それにもかかわらず、私が認識している標準には、多次元配列の最初の要素へのポインターを積の配列へのポインターとして実際に再解釈できる条項はありません。多くの句では、配列の要素にのみアクセスする方法、または末尾を 1 つだけアクセスする方法について説明しています。

于 2013-11-08T15:42:55.313 に答える
0

前の人が言ったように、あなたのコードには型エラーがあります。int 仮引数に対して int ( )[X] 型の実引数を使おうとしています。したがって、コードを機能させるには、型キャストを使用する必要があります。

C++/C は、オブジェクトの割り当てにメモリのどのセクションが使用されるかに依存せずに、データ型に同じメモリ レイアウトを使用するため、値が存在する場所に同じコードを使用できます。したがって、2 番目の質問に対する答えは、コードがスタック割り当て値で動作している場合、ヒープ割り当て値でも動作するということです。

于 2013-11-08T15:44:39.940 に答える