与malloc的问题

与malloc的问题,c,multidimensional-array,malloc,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);

使用
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;
}
#包括
#包括
int main(){
int n;
int i,j;
int**adj;
//N*N矩阵的读取大小
scanf(“%d”和“&n”);
//为二维数组动态分配内存
adj=(int**)malloc(sizeof(int)*n);
对于(i=0;i这是不正确的:

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))
{
}
有用的阅读:

替换为

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”


ie:内存数组中由“adj”指向的每个位置都应该包含另一个内存块的地址。因此需要提供sizeof(int*),在分配“adj”时。

如果每个数组的N是常量,则最好将其重新对齐到一维数组,并通过简单的乘以N来计算元素索引。除此之外,它应该是
adj=(int**)malloc(sizeof(int*)*N)
我希望这只是一个糟糕的复制粘贴?为了帮助OP理解原因,这是因为在64位平台上指针是64位(即8字节),而
int
是32位(即4字节)。因此使用
sizeof(int)调用
malloc
意味着分配的内存将是所需内存的一半。机器上整数的大小取决于底层操作系统和体系结构的组合。如果64位机器上的操作系统(加上GCC)为64位,整数和指针也需要8字节(64位)……不是吗?
adj = (int**)malloc(sizeof(int*) * n);