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



请告诉我出了什么事。

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

代码如下:

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

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

相关内容

  • 没有找到相关文章

最新更新