如何在2D数组中动态分配内存并存储值?

时间:2017-08-15 15:06:14

标签: c arrays

我正在尝试动态分配2D数组中的内存,但我不知道出了什么问题。

错误
让输入

2 2
1 2 3 4 5 6 7 8 9 ........

然后程序崩溃

#include<stdio.h>
#include<stdlib.h>

int main()
{
    int N,M;
    int i,j;
    scanf("%d %d",&N,&N);

    int **A = (int **)malloc(N*sizeof(int *));

    for(i=0;i<N;i++)
    {
        A[i] = (int *)malloc(M*sizeof(int));
    }

    for(i=0;i<N;i++)
    {
        for(j=0;j<M;j++)
        {
            scanf("%d",&A[i][j]);
        }
    }

    for(i=0;i<N;i++)
    {
        for(j=0;j<M;j++)
        {
            printf("%d",A[i][j]);
        }
    }

    return 0;
}

2 个答案:

答案 0 :(得分:2)

这是你的问题:

scanf("%d %d",&N,&N);

当您读入数组维度时,您会两次阅读N,而不会读入M。因此,M的内容不确定,并且尝试读取该值会调用undefined behavior

修复此问题以输入M

的值
scanf("%d %d",&N,&M);

答案 1 :(得分:1)

正如我所说,问题在于扫描NM变量。

更改

scanf("%d %d",&N,&N);

scanf("%d",&N);
scanf("%d",&M);

你没事。

问题是您正在阅读N两次而没有读取未初始化的M

非静态变量(局部变量) indeterminate 。在分配值之前读取它们会导致未定义的行为。

你应该释放所有已分配的内存

for(i=0;i<N;i++)
{
    free(A[i]);
}
free(A);

并且不要施放malloc()的返回值因为

  • 它的reduntand
  • 添加强制转换可能会掩盖无法包含标题stdlib.h的错误,其中找到了malloc的原型
  • 如果更改了指针的类型,则必须修复调用malloc()并投射的所有代码行

下次如果找不到bug,尝试使用调试器并查看究竟发生了什么,您可以看到变量值,您会在哪里清楚地看到M未初始化且未发生变化scanf()