传递C char数组并分配导致程序崩溃

时间:2012-08-14 19:06:57

标签: c windows memory

我不知道这是什么错误,因为这是在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;
}

5 个答案:

答案 0 :(得分:2)

如上所述,bar中的NULL检查是不必要的,因为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;
}

答案 1 :(得分:1)

尝试为正在创建的3D阵列分配空间

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

这至少可以为你的所有元素提供足够的空间。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

问题可能是堆栈上没有足够的空间来分配大量的缓冲区。我建议你dynamically allocate数组。

您还可以使用便捷宏分配您索引的平面缓冲区,如this post中所述。唯一的区别是你的数组是“3d”而不是“2d”。

答案 4 :(得分:0)

您正在堆栈中为“table”变量使用500x20x60 = 600000字节进行分配。

如果你的shell是bash

ulimit -s([{1}}代表[t] csh)

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