构建成功,但堆已损坏。使用2-D阵列

时间:2012-11-08 20:04:48

标签: c arrays 2d malloc heap

我已经创建了一个二维数组,但是失败了,我在lab10.exe中得到了#0x; 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);
    }
}

还有更多,但是我从同一个整数&#39;中做了4次不同的时间。谢谢!

5 个答案:

答案 0 :(得分:2)

这一行错了:

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

您为dimension类型的int元素分配了足够的空间,但之后您将其用作int*的数组。如果您正在编译64位程序,那么sizeof(int*)为8但sizeof(int)为4,因此您没有分配足够的空间。您需要使用sizeof(int*)

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

答案 1 :(得分:2)

在摘录

//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的数组始终是正确的。

答案 2 :(得分:2)

首先:

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”本身的记忆。

答案 3 :(得分:0)

我花了一些时间编译你的第一个例子,它运行正常,我认为错误可能是a必须是int **a类型。此外,我必须将类型添加到ri变量。如果这不起作用,那么我认为你必须指定错误的行,并添加变量声明和#includes。希望这有助于......

答案 4 :(得分:0)

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