-2

私はほとんどCの初心者で、2次元配列を割り当て、変更し、再割り当てして印刷したいと考えています。コードを使用した両方の回答は役に立ちました。コードは次のとおりです。

    main()
    {
     int i, j, L , **lp ;
      scanf("%i" , &L );
      lp = calloc(L , sizeof(*lp) );
      for(i=0 ; i<L ; i++)
      lp[i] = calloc( L , sizeof( *(lp[i])) );

      for(i=0 ; i<L ; i++)
      {
          for(j=0 ; j<L ; j++ )
          {
           lp[i][j]=0;
           printf("%i\t" , lp[i][j] );
          }
       printf("\n");
      }
       free( lp );
       return(0);
     }
4

3 に答える 3

1

ここには多くのエラーがありますが、割り当てについては次のようにする必要があります。

int main()
{
    int i = 0;
    int j = 0;
    int L = 0;
    int **lp = NULL;

    scanf("%i", &L);
    if (!(lp = calloc(L, sizeof(*lp)))) //allocate 1st dimension
        return (0);
    for (i = 0; i < L; i++)
    {
        lp[i] = calloc(L, sizeof(*(lp[i]))); //all 2nd dimensions
    }
    return (0);
}

そして、mallocのリターンをキャストしないでください...

于 2012-11-09T08:31:45.810 に答える
1

多くのことが間違っています。

1. for ループ

{   for(j=0 , j<0 , j++ )


for (initialization_expression;loop_condition;increment_expression){..}

いずれかが欠けている場合は空白のままにしますが、セミコロンは必要です。

それでもj=0;j<0条件としては意味がありません。

2.スペルミス

2 番目の for ループ内で lp のスペルを pl と間違えました。

3.メイン

mainの戻り値の型が指定されていません。これは報告されていませんが、古いスタイルであり、もう使用すべきではありません。

4.動的割り当て

これは、2 次元配列を動的に割り当てる方法ではありません。

于 2012-11-09T08:02:43.453 に答える
0

まず、for ループのエラーを修正します。構文が間違っています。変数のスペルをチェックします。

次に、割り当て部分です。コード内の 1 次元配列にのみメモリを割り当てました。2 次元配列を割り当てるには、次の手順に従います。

まず、ポインターの配列を割り当てる必要があります。そして、配列のサイズは行数です。次に、2D 配列の各行にメモリを割り当てます。そして、各行のアドレス (基本的には 1D 配列、したがってポインター) を、既に割り当てたポインターに割り当てます。

したがって、最初にポインター配列へのポインターが必要です。そして、この配列内のポインターへの各ポインターに対して、2D 配列内の行に対応する配列を割り当てます。

できることは次のとおりです。

int **a;
int size,x;

//--- Obtain size of array in size;

a = calloc(size,sizeof(int *));  //Allocating a row of pointers and assigning to **a 

//for each *a in *a[] (i.e **a), we assign an array of ints.
for(x = 0; x < size; x ++) 
{
  a[x] = calloc(size,sizeof(int)); 
}

これで、次のようにこの配列にアクセスできます。

for(i=0;i<size;i++)
  for(j=0;j<size;j++)
  {
    //do something with a[i][j]
  }
于 2012-11-09T08:24:49.000 に答える