我已经创建了一个二维数组,但是失败了,我在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次不同的时间。谢谢!
答案 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
类型。此外,我必须将类型添加到r
和i
变量。如果这不起作用,那么我认为你必须指定错误的行,并添加变量声明和#includes
。希望这有助于......
答案 4 :(得分:0)
我发现了我的错误!这是一个无限循环,位于我的其他'for'循环中!另外,正如上面许多人所说的,我应该将(int *)乘以(int)而不是!非常感谢你!