3
4

3 に答える 3

10

2つの配列は可変長配列です。Cで可変長配列を初期化することはできません。

int配列のすべての要素を設定するには、次の関数0を使用できます。memset

memset(plansza, 0, sizeof plansza);

ちなみに、可変長配列ではない配列を初期化する場合、すべての要素を初期化するための有効な形式0は次のとおりです。

int array[31][14] = {{0}};  // you need the {}
于 2013-01-06T21:23:40.270 に答える
1

両方の次元が不明な場合は、1次元配列を使用し、自分でインデックスを作成する必要があります。

int *ary = (int *) malloc(x * y * sizeof(int));
memset(ary, 0, x * y * sizeof(int));
int elem1_2 = ary[1 * x + 2];
int elem3_4 = ary[3 * x + 4];

等々。いくつかのマクロまたはアクセス関数をより適切に定義します。そして、使用後にメモリを解放します。

于 2013-01-06T21:30:05.827 に答える
1

@Chrisの提案に代わるもの:

2次元配列を1次元配列の配列として作成できます。これにより、以前と同じように配列要素のインデックス作成を行うことができます。この場合、配列はスタックではなくヒープに割り当てられることに注意してください。したがって、アレイが不要になった場合は、割り当てられたメモリをクリーンアップする必要があります。

例:

#include <malloc.h>
#include <string.h>

/* Create dynamic 2-d array of size x*y.  */
int** create_array (int x, int y)
{
  int i;
  int** arr = (int**) malloc(sizeof (int*) * x);
  for (i = 0; i < x; i++)
    {
      arr[i] = (int*) malloc (sizeof (int) * y);
      memset (arr[i], 0, sizeof (arr[i]));
    }
  return arr;
}

/* Deallocate memory.  */
void remove_array (int** arr, int x)
{
  int i;
  for (i = 0; i < x; i++)
    free (arr[i]);
  free (arr);
}

int main()
{
  int x = 5, y = 10;
  int i, j;
  int** plansza = create_array (x, y); /* Array creation.  */
  plansza[1][1] = 42; /* Array usage.  */
  remove_array (plansza, x); /* Array deallocation.  */
  return 0;
}
于 2013-01-06T21:53:23.000 に答える