0

请告诉我有什么问题。

创建二维动态数组:我创建了一个指针数组,然后为每个指针分配了一个块。

这是代码:

#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;
}

看不到这种未定义行为的任​​何原因......

4

2 回答 2

4

这条线

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

为 5 个指向整数列表的指针创建足够的空间

然后你写

for ( i = 0; i < 10; i++ )
   a[i] = (int *)malloc(10*sizeof(int ));

您尝试使用其中的 10 个的地方!

因此未定义的行为。将 10 更改为 5 或分配正确的空间量

于 2013-04-11T17:31:43.863 回答
2

Ed Heal 和 Mat 告诉你问题出在哪里,所以让我告诉你如何不再有这个问题。

避免在代码中使用“幻数”。

分配时,将大小放入变量中(使用数字恰好 ONCE),然后在需要大小的任何地方使用该变量。

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

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

于 2013-04-11T17:35:47.913 回答