我正在尝试动态分配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;
}
答案 0 :(得分:2)
这是你的问题:
scanf("%d %d",&N,&N);
当您读入数组维度时,您会两次阅读N
,而不会读入M
。因此,M
的内容不确定,并且尝试读取该值会调用undefined behavior。
修复此问题以输入M
:
scanf("%d %d",&N,&M);
答案 1 :(得分:1)
正如我所说,问题在于扫描N
和M
变量。
更改
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()
的返回值因为
stdlib.h
的错误,其中找到了malloc的原型malloc()
并投射的所有代码行下次如果找不到bug
,尝试使用调试器并查看究竟发生了什么,您可以看到变量值,您会在哪里清楚地看到M
未初始化且未发生变化scanf()
。