尝试在C中分配二维数组时出错

时间:2016-05-02 19:48:56

标签: c windows gcc memory memory-management

问题信息: 编译器:mingw32-gcc.exe(tdm-1)4.7.1 CLI:gcc z:\ ES16 \ main.c -o main.exe 代码测试:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define DIM 3

void print_matrix(int**  _mtx);
int main()
{
    int i,j;
    srand(time(NULL));
    int **mtx;
    mtx = (int **)malloc(sizeof(int*)*DIM);
    for (i=0;i<DIM;i++)
    {
        mtx[i] = (int *)malloc(sizeof(int*)*DIM);
    }

    for(i=0;i<DIM*DIM;i++)
    {
        for(j=0;j<DIM;j++)
        {
           *((*(mtx)) + (i * DIM + j))= (int)(rand() % 10 + 1);
        }


    }
    print_matrix(mtx);

    free(mtx);

    return 0;
}

void print_matrix(int** _mtx)
{
    int i,j;
    for(i=0;i<DIM;i++)
    {
        for(j=0;j<DIM;j++)
        {
            printf("%d  ",*((*(_mtx)) + (i * DIM + j)));
        }
        printf("\n");
    }
}

下面我们有一些观点让我们认为问题是Windows而不是编译器:

  1. 该程序在Linux下可以正常运行
  2. 适用于Windows 10 Code :: Blocks 16.01及其默认编译器
  3. 使用Code :: Blocks 12.11和mingw32-gcc.exe(tdm-1)4.7.1
  4.   

    尽管上面的所有内容都无法启动   windows deafult shell。

    有时程序会在没有打印矩阵的情况下崩溃,有时在打印部分矩阵后会崩溃。
    总是没有任何特别的理由。

    考虑到所有这些问题似乎是Windows的问题所以我们希望对此问题有一些澄清。

1 个答案:

答案 0 :(得分:0)

发现了4个问题:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define DIM 3

void print_matrix(int**  _mtx);
int main()
{
    int i,j;
    srand(time(NULL));
    int **mtx;
    mtx = malloc(sizeof(int*)*DIM);
    for (i=0;i<DIM;i++)
    {
        mtx[i] = malloc(sizeof(int)*DIM);  /* 1: sizeof int, not int* */
    }

    for(i=0;i<DIM;i++)  /* 2: just DIM, not DIM*DIM */
    {
        for(j=0;j<DIM;j++)
        {
           mtx[i][j]= (int)(rand() % 10 + 1); /* 3: i * DIM + j   magic is used if you have a 1 dimension array, but want to access it as two dimensions */
        }
    }
    print_matrix(mtx);

    free(mtx);

    return 0;
}

void print_matrix(int** _mtx)
{
    int i,j;
    for(i=0;i<DIM;i++)
    {
        for(j=0;j<DIM;j++)
        {
            printf("%d  ",_mtx[i][j]); /* 4: same as 3 */
        }
        printf("\n");
    }
}