1

これは Windows でのエラーであり、Windows でプログラムを実行する方法がわかりません。ここでプログラムがクラッシュする理由についてのアイデアはありますか (コメント行を参照)。メモリの誤用に関係している可能性があると思います。

#define TABLE_MAX_ROW       500
#define TABLE_MAX_COL       20
#define TABLE_MAX_ELT_LEN   60

ここから始める:

foo()
{
    char table[TABLE_MAX_ROW][TABLE_MAX_COL][TABLE_MAX_ELT_LEN];

    bar(table);
}

この関数に渡します:

bar(char table[TABLE_MAX_ROW][TABLE_MAX_COL][TABLE_MAX_ELT_LEN])
{
    unsigned int col, row;

    if (table == NULL) { // crashes here
        printf("error: table == NULL!\n");
        return -1;
    }

    for (row = 0; row < TABLE_MAX_ROW; row++)
    for (col = 0; col < TABLE_MAX_COL; col++)
        table[row][col][0] = '\0'; // if above if block commented out, crashes here

    return 0;
}
4

5 に答える 5

2

記述されているように、は動的に割り当てられないため、NULLチェックインbarは不要です。 tablefoo

そうは言っても、おそらくその配列定義(60 Kb)でスタックフレームサイズを超えているため、でランタイムの問題が発生しbar、クラッシュが発生します。

次のようにアレイを動的に割り当ててみてください。

void foo (void) // explicitly type all functions
{
  /**
   * Declare a *pointer* to a 2D array of col x len and
   * allocate rows elements of it:
   */
  char (*table)[TABLE_MAX_COL][TABLE_ELT_LEN] =
    malloc(sizeof *table * TABLE_MAX_ROW);

  if (table)
  {
    bar(table);
  }

  free(table);
}

int bar(char (*table)[TABLE_MAX_COL][TABLE_ELT_LEN])
{
  unsigned int row, col;

  /**
   * Some duplication of effort here, since we made the null check
   * in foo, but what the heck.
   */
  if (!table)
  {
    // handle error as above
    return -1;
  }

  // process table as above
  return 0;
}
于 2012-08-14T19:30:42.987 に答える
1

作成している3D配列にスペースを割り当ててみてください

char *** table = malloc(sizeof(sizeof(sizeof(char)* TABLE_MAX_ELT_LEN)* TABLE_MAX_COL)* TABLE_MAX_ROW)

これにより、少なくともすべての要素に十分なスペースが提供されます。

于 2012-08-14T19:21:33.453 に答える
1

プログラムメモリはOSに依存します。クラッシュの理由は、システムがスタック上のそのような大きなアレイ割り当て(ほぼ0.6MB!)を満たすことができなかったためだと強く思います。のために行く方がいいですmalloc

于 2012-08-14T19:25:10.410 に答える
1

問題は、その大きなバッファを割り当てるのに十分なスペースがスタックにないことである可能性があります。配列を動的に割り当てることをお勧めします。

この投稿で説明されているように、便利なマクロを使用してインデックスを作成するフラット バッファーを割り当てることもできます。唯一の違いは、配列が「2d」ではなく「3d」であることです。

于 2012-08-14T19:26:59.363 に答える
0

「テーブル」変数のスタックで500x20x60=600000バイトを使用して割り当てています。

あなたのシェルがbash

ulimit -slimit stacksize[t] cshの場合)

プログラムのスタックで使用できるメモリの最大量が表示されます。この制限を超えて使用する場合、これがプログラムのセグメンテーション違反の原因です。

于 2012-08-14T19:29:38.317 に答える