【问题标题】:Allocating memory of a 3 Dimentional array using calloc in c在 c 中使用 calloc 分配 3 维数组的内存
【发布时间】:2014-12-08 02:28:52
【问题描述】:

我正在尝试为 [10][10][2] 的 3 维字符数组分配内存。将所有值设置为空格时,会出现分段错误:[0][2][1] 处的 11。 代码如下:

aiBoard =(char ***) calloc(SIZE,sizeof(char **));

for(i = 0; i < SIZE;i++)
{
    aiBoard[i] = (char **)calloc(SIZE, sizeof(char*));
}
for(i = 0;i < SIZE;i++)
{
    for(j = 0; j < 2; j++)
    {
        aiBoard[i][j] = (char*)calloc(2,sizeof(char));
    }

}

for(i = 0; i < SIZE; i++)
{
    for(j = 0; j < SIZE; j++)
    {
        for(k = 0; k < 2; k++)
        {
            aiBoard[i][j][k] = ' ';
        }
    }
}

【问题讨论】:

  • 您将SIZE2 混合用于第二级。 (j)
  • 您实际上分配了维度[10][2][2] - 将第一个j &lt; 2 更改为j &lt; 10。使用一组嵌套循环而不是其中的 3 个会更清楚。
  • 我明白你的意思,但它分配了很多内存。
  • 请注意,如果您在创建数组后不需要调整最后两个维度的大小,那么您可以分配它with a single malloc call

标签: c arrays dynamic-memory-allocation calloc


【解决方案1】:

您使用了SIZE 的什么值? 0 或 1 会导致崩溃,超过 2 会导致崩溃。您是否在真正使用的任何地方都使用SIZE?否则你只是calloc - ing 2 和硬编码'2'的其他用途......应该改为SIZE

像这样:

for(i = 0;i < SIZE;i++)
{
    for(j = 0; j < SIZE; j++)
    {
        aiBoard[i][j] = (char*)calloc(SIZE,sizeof(char));
    }

}

for(i = 0; i < SIZE; i++)
{
    for(j = 0; j < SIZE; j++)
    {
        for(k = 0; k < SIZE; k++)
        {
            aiBoard[i][j][k] = ' ';
        }
    }
}

真的应该有三种尺寸

#define iSIZE (10)
#define jSIZE (10)
#define kSIZE (2)

  for(i = 0;i < iSIZE;i++)
    {
        for(j = 0; j < jSIZE; j++)
        {
            aiBoard[i][j] = (char*)calloc(jSIZE,sizeof(char));
        }

    }

for(i = 0; i < iSIZE; i++)
{
    for(j = 0; j < jSIZE; j++)
    {
        for(k = 0; k < kSIZE; k++)
        {
            aiBoard[i][j][k] = ' ';
        }
    }
}

【讨论】:

  • SIZE 定义为 10
  • 请显示您对 aiBoard 的定义 .... 它不能是 char aiBoard[10][10][2];因为该声明不能是 calloc-ed 或 malloc-ed....
  • 定义为 char ***aiBoard。
猜你喜欢
  • 1970-01-01
  • 2017-01-12
  • 1970-01-01
  • 1970-01-01
  • 2011-10-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-18
  • 2012-02-05
相关资源
最近更新 更多