malloc的问题

时间:2012-09-25 09:00:35

标签: c multidimensional-array malloc

当使用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;
}

3 个答案:

答案 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'。