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是不必要的,因为table不是在foo.

话虽如此,您可能使用该数组定义(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

程序存储器取决于操作系统。我强烈怀疑崩溃的原因是您的系统无法满足堆栈上如此大的数组分配(几乎 0.6MB!)。最好去malloc

于 2012-08-14T19:25:10.410 回答
1

问题可能是您的堆栈上没有足够的空间来分配这么大的缓冲区。我建议你动态分配数组。

您还可以使用本文所述的便利宏分配一个平面缓冲区,您可以将其索引到该缓冲区。唯一的区别是你的数组是“3d”而不是“2d”。

于 2012-08-14T19:26:59.363 回答
0

您正在使用堆栈上的 500x20x60=600000 字节为“表”变量分配。

如果你的外壳是bash

ulimit -slimit stacksize对于 [t]csh)

将显示您可以在程序堆栈上使用的最大内存量。如果你使用超过这个限制,这就是你的程序段错误的原因。

于 2012-08-14T19:29:38.317 回答