程序未定义的行为。有时它可以工作,有时在运行时发生错误

时间:2013-04-11 17:29:04

标签: c malloc

请告诉我有什么问题。

创建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;
}

看不出有任何这种未定义行为的原因......

2 个答案:

答案 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)

Ed Heal和Mat告诉你问题出在哪里,让我告诉你如何再也不会遇到这个问题。

在代码中避免使用“Magic Numbers”。

分配时,将大小放在变量中(使用数字完全为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 };

如果数字是常数(变量适用于不同的变量),这两个选项通常会更好。