请告诉我有什么问题。
创建2d动态数组: 我已经创建了一个指针数组,然后我为每个指针分配了一个块。
以下是代码:
#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;
}
看不出有任何这种未定义行为的原因......
答案 0 :(得分:4)
这一行
a = (int **)malloc(5*sizeof(int *));
为指向整数列表的指针创建足够的空间
然后你写
for ( i = 0; i < 10; i++ )
a[i] = (int *)malloc(10*sizeof(int ));
你试图使用其中10个!
因此未定义的行为。要么改变10到5,要么分配正确的空间量
答案 1 :(得分:2)
分配时,将大小放在变量中(使用数字完全为ONCE),然后在需要大小的地方使用该变量。
int an = 5;
a = (int **)malloc(an * sizeof(int *));
...
for ( i = 0; i < an; i++ )
a[i] = (int *)malloc(10*sizeof(int ));
正如埃德提醒我的那样,它不一定是变数。您可以使用预处理器宏。
#define AN 5
或者您也可以使用enum
。
enum { AN = 5 };
如果数字是常数(变量适用于不同的变量),这两个选项通常会更好。