【问题标题】:Build Succeeds, But have heap corupted. Using 2-D Arrays构建成功,但堆已损坏。使用二维数组
【发布时间】:2012-10-29 02:40:04
【问题描述】:

我创建了一个二维数组,但失败了,我得到“lab10.exe 中 0x77a415de 处的未处理异常:0xC0000374:堆已损坏。”不知道从这里去哪里或如何调试。我相信这与我的数组大小或使用 malloc() 有关。非常感谢您提前提供的帮助!

//Get the number of Columns from the user
printf("Enter the number of rows and columns:\n");
scanf("%d", &dimension);

//Allocate 1-D Array of Pointers, Array 'a'
a = (int** ) malloc( sizeof(int)*dimension);
if(a == NULL)
{
    printf("\nError Allocating Memory");
    exit(1);
}

//Allocate Rows for 2-D Array; Array 'a'
for(r = 0; r < dimension; r++)
{
    a[r] = (int*) malloc( sizeof(int) * dimension);
    if (a[r] == NULL)
    {
        for(i = 0; i< r; i++)
            free(a[i]);
        printf("\nError Allocating Memory");
        exit(1);
    }
}

还有更多,但我从同一个整数“维度”执行了 4 次不同的操作。谢谢!

【问题讨论】:

  • 我认为你应该为你的问题添加“c”作为标签
  • 我看不出你的分配有什么特别的问题。似乎更有可能在另一点上超出了一个或多个数组 - 一旦分配了这些数组,您可能需要展示一些如何使用这些数组...

标签: arrays c malloc 2d heap-memory


【解决方案1】:

这一行是错误的:

a = (int** ) malloc( sizeof(int)*dimension);

您正在为int 类型的dimension 元素数组分配足够的空间,但随后您将其用作int* 数组。如果你正在编译一个 64 位程序,那么 sizeof(int*) 是 8 而 sizeof(int) 是 4,所以你没有分配足够的空间。你需要使用sizeof(int*):

a = (int** ) malloc( sizeof(int*)*dimension);
//                          ^^^^^

【讨论】:

    【解决方案2】:

    在sn-p中

    //Allocate 1-D Array of Pointers, Array 'a'
    a = (int** ) malloc( sizeof(int)*dimension);
    

    注释与实际代码不符。在代码中,您为 dimension 整数分配空间,而不是指针。

    由于指针可能比 int 大,分配行的循环超出了分配的内存。

    初始分配应为

    a = malloc( sizeof(int*)*dimension);
    

    a = malloc( dimension * sizeof *a);
    

    第二种形式的优点是它对于分配任何大小为dimension的数组总是正确的。

    【讨论】:

      【解决方案3】:

      第一:

      a = (int** ) malloc( sizeof(int)*dimension);
      

      您正在分配指针数组,因此您需要:

      a = (int** ) malloc( sizeof(int*)*dimension);
      

      不保证int和int*的大小相同!

      第二:

      if (a[r] == NULL)
      {
          for(i = 0; i< r; i++)
              free(a[i]);
          printf("\nError Allocating Memory");
          exit(1);
      }
      

      释放所有行的内存,但不释放“a”本身的内存。

      【讨论】:

        【解决方案4】:

        我花点时间编译了你的第一个示例,它运行良好,我认为错误可能是a 必须是int **a 类型。我还必须将类型添加到 ri 变量中。如果这不起作用,那么我认为您必须指定错误行,并添加变量声明和#includes。希望这可以帮助...

        【讨论】:

        • 我应用了您建议的更改,但似乎我遇到了同样的错误!不过我明白你在说什么!
        【解决方案5】:

        我发现了我的错误!这是一个无限 for 循环,位于我的其他“for”循环之一中!另外,正如上面许多人所说,我应该乘以 (int*) 而不仅仅是 (int)!非常感谢!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-02
          • 2019-01-22
          • 2011-10-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多