当使用malloc()
为二维数组分配内存时,当输入大小(矩阵N*N)大于5
(即N>5
)时会发生分割错误。
下面的代码对于小于 5
的输入 (N) 工作正常。
你能帮我解决问题吗?
#include<stdio.h>
#include <stdlib.h>
int main(){
int n;
int i,j;
int **adj;
//reading size of a N*N matrix
scanf("%d",&n);
//dynamically allocating memory for a 2-dimensional array
adj=(int**)malloc(sizeof(int)*n);
for(i=0;i<n;i++){
adj[i]=(int*)malloc(sizeof(int)*n);
}
//taking input from the file
for(i=0;i<n;i++){
for(j=0;j<n;j++){
scanf("%d",&adj[i][j]);
}
}
for(i=0;i<n;i++){
for(j=0;j<n;j++){
printf("%dt",adj[i][j]);
}
printf("n");
}
return 0;
}
不正确的:
adj=(int**)malloc(sizeof(int)*n);
因为您正在分配一个int*
数组,而不是int
.更改为:
adj = malloc(sizeof(int*)*n); /* Cast unnecessary. */
/* or: adj = malloc(sizeof(*adj)*n); */
建议检查 scanf()
的返回值,以确保正确读取int
:
if (1 == scanf("%d", &n))
{
}
有用的阅读: 我是否投射 malloc 的结果?
adj=(int**)malloc(sizeof(int)*n);
将其替换为
adj = (int**)malloc(sizeof(int*) * n);
因为一般来说sizeof(int*) != sizeof(int)
另一个提示:初始化变量!!
除了hmjd指针之外,也许它可能会提供更多的信息。
int p -> p 是 int 类型。
int * p-> p 是指向 'int' 的指针 (*p) 类型
int ** p -> p 是指向"指向 int 即:(int *)"的指针 (*p) 类型
。如果从左边读来写,会更容易理解。
int ** adj -> 您需要两个指针取消引用 ( **) 才能达到值 'int'。
即:内存数组中由"adj"指向的每个位置都应该保存另一个内存块的地址。因此,您需要提供 sizeof(int *),同时分配 'adj'。