1
#include<stdio.h>
using namespace std;
void fun(int** a){}
int main()
{
    int n;
    scanf("%d",&n);
    int a[n][n];
    fun(a);
    return 0;
}

C++ でこのエラーが発生しましたが、C では問題なく動作していますが、(void*)a に型キャストされてから、配列 =(int**)a に変換されます。

test_.cpp:9:8: error: cannot convert
   ‘int (*)[(((unsigned int)(((int)n) + -0x00000000000000001)) + 1)]’
to ‘int**’ for argument ‘1’ to ‘void fun(int**)’
tried to pass a[][size] but size is not known
4

4 に答える 4

1

コードにはいくつかの問題があります。1 つは C で、もう 1 つは C++ です。

C の問題:
C でも、多次元配列int a[n][n]は に変換されませんint**。不規則な (またはギザギザの) 多次元配列と連続した多次元配列の間には大きな違いがあります。不規則配列は次のように宣言され、割り当てられます。

  • int ** jagged_array
    このスタイルで宣言されたジャグ配列は、当然のことながら、int**何らかの関数に引数として渡すことができます。変換は必要ありません。このタイプの配列では、プログラマーは、配列int*内の各行へのポインターの配列にストレージを割り当て (最終的には解放し)、配列の各行にもストレージを割り当てます (最終的には解放します) 必要があります。

  • int * jagged_array[size_spec].
    このスタイルで宣言されたジャグ配列はint**、C (および C++) では配列がポインターに減衰するため、一部の関数に引数として渡すこともできます。このタイプの配列では、プログラマは配列の行ごとにストレージを割り当てる (そして最終的には解放する) 必要があります。

int*どちらの形式でも、配列の行の 0 番目の要素を指すポインタ用のメモリ内の明示的な場所があることに注意してください。多次元配列の場合はそうではありません。多次元配列内の行へのポインターは、格納されるのではなく、計算されます。として宣言された多次元配列は、int a[n][n]に減衰できませんint**。代わりに に崩壊しますint*[n]。C では、 your のような可変長多次元配列を受け取る関数はint a[n][n]として宣言する必要があります<return_type> fund (int n, int vla[n][n])。(配列引数は として指定することもできますvla[][n]。外側の次元は必要ありません。)


C++ の問題:
可変長配列を使用しています。C++ はその C99 の概念をサポートしていません。その概念は、C++ の元の 1998 年バージョンの C には存在しませんでした。2003 C++ 標準は 1998 C++ 標準のマイナー リビジョンであるため、C99 にはジャンプしませんでした。最新の C++ 標準である C++11 の作成者は、これらの C99 可変長配列のサポートを明示的に拒否しました。C++ で可変長配列を使用することはできません。少なくとも移植性はありません。

于 2013-03-30T15:09:50.303 に答える