请告诉我出了什么事。
创建二维动态数组我创建了一个指针数组,然后为每个指针分配了一个块。
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int i, j;
int **a = NULL;
a = (int **)malloc(5*sizeof(int *));
if ( NULL == a)
{
printf("Failed to allocate memory.");
return 1;
}
for ( i = 0; i < 10; i++ )
a[i] = (int *)malloc(10*sizeof(int ));
for ( i = 0; i < 5; i++ )
{
for ( j = 0; j < 10; j++ )
a[i][j] = i*j;
}
for ( i = 0; i < 5; i++ ) // While running it prints this array. But...
{
for ( j = 0; j < 10; j++ )
printf("%4d", a[i][j]);
printf("n");
}
/* Trying to free allocated memory. */
for ( i = 0; i < 5; i++ ) // ... sometimes app crashes around here.
{
free(a[i]);
}
return 0;
}
这一行
a = (int **)malloc(5*sizeof(int *));
为指向整型列表的5个指针创建足够的空间
然后写
for ( i = 0; i < 10; i++ )
a[i] = (int *)malloc(10*sizeof(int ));
你试图使用其中10个!
因此未定义行为。将10更改为5或分配正确的空间
Ed Heal和Mat告诉你问题在哪里,所以让我告诉你如何永远不再出现这种问题。
避免在代码中使用"魔术数字"。
在分配时,将大小放入一个变量中(使用恰好一次的数字),然后在需要大小的地方使用该变量。
int an = 5;
a = (int **)malloc(an * sizeof(int *));
...
for ( i = 0; i < an; i++ )
a[i] = (int *)malloc(10*sizeof(int ));
正如Ed提醒我的,它不一定是一个变量。你可以使用预处理器宏。
#define AN 5
或者您也可以使用enum
。
enum { AN = 5 };
如果数字是常量,这两个选项通常更好(变量用于变化的东西)。