当使用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("%d\t",adj[i][j]);
}
printf("\n");
}
return 0;
}
答案 0 :(得分:2)
这是不正确的:
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))
{
}
有用的读物:Do I cast the result of malloc?
答案 1 :(得分:0)
adj=(int**)malloc(sizeof(int)*n);
将其替换为
adj = (int**)malloc(sizeof(int*) * n);
因为一般sizeof(int*) != sizeof(int)
另一个提示:初始化你的变量!!!
答案 2 :(得分:0)
除了那个hmjd指针外,也许它可能提供更多的信息。
int p - &gt; p的类型为int。
int * p - &gt; p是指向'int“的指针(* p)类型
int ** p - &gt; p是指向“指向int ie:(int *)”
的指针的指针(* p)类型如果从左边读取写入,则更容易理解。
int ** adj - &gt;你需要两个指针解引用(**)来达到值'int'。
ie:'adj'指向的内存数组中的每个位置都应该保存另一块内存的地址。因此,您需要提供sizeof(int *),同时分配'adj'。