使用malloc在运行时分配内存时出现分段错误

使用malloc在运行时分配内存时出现分段错误,c,arrays,pointers,malloc,dynamic-memory-allocation,C,Arrays,Pointers,Malloc,Dynamic Memory Allocation,这是我的密码。我的目的是在运行时将内存分配给2D数组,直到输入中给定的大小为止 分段错误发生的原因是什么?是因为数组元素必须连续存储,并且malloc(动态分配)不允许这种情况发生吗? 或我在编写此代码时出错。请引导我通过。 提前谢谢 int main(){ // STEP 1 int size,**arr,i=0,j=0; printf("Enter the size of matrix : "); scanf("%d",&size); // S

这是我的密码。我的目的是在运行时将内存分配给2D数组,直到输入中给定的大小为止

分段错误发生的原因是什么?是因为数组元素必须连续存储,并且malloc(动态分配)不允许这种情况发生吗? 我在编写此代码时出错。请引导我通过。 提前谢谢

int main(){
    // STEP 1
    int size,**arr,i=0,j=0;
    printf("Enter the size of matrix : ");
    scanf("%d",&size);
    // STEP 2
    arr = (int**)malloc(size*size*sizeof(int));
    printf("\n Enter the %d elements  : \n",size*size);
    for(i=0;i<size;i++){
        for(j=0;j<size;j++){
        // STEP 3
            scanf("%d",&arr[i][j]);
        }
    }
    /*
    for(i=0;i<size;i++){
        for(j=0;j<size;j++){
            printf("%d\n",matrix[i][j]);
        }
    }
    */
    return 0;
}
intmain(){
//第一步
整数大小,**arr,i=0,j=0;
printf(“输入矩阵的大小:”);
scanf(“%d”,大小(&S);
//步骤2
arr=(int**)malloc(size*size*sizeof(int));
printf(“\n输入%d个元素:\n”,大小*大小);

对于(i=0;i你应该这样分配:

arr = malloc(size * sizeof(int*));
for (int i = 0; i <size; i++)  
    arr[i] =  malloc(size * sizeof(int));   
arr=malloc(size*sizeof(int*);

对于(int i=0;i您应该这样分配:

arr = malloc(size * sizeof(int*));
for (int i = 0; i <size; i++)  
    arr[i] =  malloc(size * sizeof(int));   
arr=malloc(size*sizeof(int*);

对于(inti=0;i这是一个典型的错误

指向指针的指针实际上与二维数组不同

当然,您可以通过
var[x][y]
语法访问这两个元素,但是

int foo[x][y]
不同于

int **bar
如果你真的想拥有这种动态,你必须为指针列表分配空间,然后依次为每个指针分配元素空间

bar = malloc( x * sizeof(int*) );
for ( int i = 0 ; i < x ; i++ )
    bar[i] = malloc( y * sizeof(int) );

这是一个典型的错误

指向指针的指针实际上与二维数组不同

当然,您可以通过
var[x][y]
语法访问这两个元素,但是

int foo[x][y]
不同于

int **bar
如果你真的想拥有这种动态,你必须为指针列表分配空间,然后依次为每个指针分配元素空间

bar = malloc( x * sizeof(int*) );
for ( int i = 0 ; i < x ; i++ )
    bar[i] = malloc( y * sizeof(int) );

一个可行的方法是使矩阵线性化,它可以消除这种双指针级别分配导致的内存碎片:

arr = (int*) malloc (size*size*sizeof(int));

然后简单地用arr[i*size+j]而不是arr[i][j]访问元素:

一个可行的方法,也可以消除这种双指针级别分配导致的内存碎片,就是使矩阵线性化:

arr = (int*) malloc (size*size*sizeof(int));

然后用arr[i*size+j]而不是arr[i][j]访问元素:

这样使用:动态内存分配的完美示例

void mxmult()
{
    int n,m,a,b,c,d, sum=0;
    int x,y,z;
    printf("Enter first order [n*n]\n");
    scanf("%d", &n);
    printf("Enter second order [m*m]\n");
    scanf("%d", &m);
    if (n!=m)
    {
        printf("Invalid orders");

    }
    else
    {
        //mem allocate for matrix 1
        int **mat1 = (int**)malloc(n*sizeof(int));
        for(x=0;x<n;x++)
            {
                mat1[x]=(int*)malloc(n*sizeof(int));
            }
        // input matrix 1
        printf("Enter the first matrix entries\n");
        for (a = 0; a <n; a++)
        {
            for (b = 0; b < n; b++)
            {
                scanf("%d", &mat1[a][b]);   
            }
        }
        // memory allocate matrix 2
        int **mat2 = (int**)malloc(m*sizeof(int));
        for(y=0;y<n;y++)
            {
                mat2[y]=(int*)malloc(m*sizeof(int));
            }

        //inpur matrix 2
        printf("Enter the second matrix entries\n");
        for (c = 0; c <n; c++)
        {
            for (d= 0; d < n; d++)
            {
                scanf("%d", &mat2[c][d]);   
            }
        }

        //Memory allocate matrix Mult
        int **mult=(int**)malloc(m*sizeof(int));
        for(z=0;z<m;z++)
            mult[z]=(int*)malloc(m*sizeof(int));
        for (a = 0; a < n; a++)
        {
            for (d = 0; d < m; d++)
            {
                for (c = 0; c < n; c++)
                {
                    sum=sum + (mat1[a][c] *mat2[c][d]);
                }
                mult[a][d] = sum;
                sum= 0;
            }
        }
        printf("Product\n");

        for ( a = 0 ; a < n ; a++ )
        {
            for ( d = 0 ; d < m ; d++)
                printf("%d\t", mult[a][d]);
            printf("\n");
        }

    }
}  
void mxmult()
{
int n,m,a,b,c,d,和=0;
int x,y,z;
printf(“输入第一个订单[n*n]\n”);
scanf(“%d”和“&n”);
printf(“输入第二顺序[m*m]\n”);
scanf(“%d”、&m);
如果(n!=m)
{
printf(“无效订单”);
}
其他的
{
//为矩阵1分配内存
int**mat1=(int**)malloc(n*sizeof(int));

对于(x=0;x如下所示:动态内存分配的完美示例

void mxmult()
{
    int n,m,a,b,c,d, sum=0;
    int x,y,z;
    printf("Enter first order [n*n]\n");
    scanf("%d", &n);
    printf("Enter second order [m*m]\n");
    scanf("%d", &m);
    if (n!=m)
    {
        printf("Invalid orders");

    }
    else
    {
        //mem allocate for matrix 1
        int **mat1 = (int**)malloc(n*sizeof(int));
        for(x=0;x<n;x++)
            {
                mat1[x]=(int*)malloc(n*sizeof(int));
            }
        // input matrix 1
        printf("Enter the first matrix entries\n");
        for (a = 0; a <n; a++)
        {
            for (b = 0; b < n; b++)
            {
                scanf("%d", &mat1[a][b]);   
            }
        }
        // memory allocate matrix 2
        int **mat2 = (int**)malloc(m*sizeof(int));
        for(y=0;y<n;y++)
            {
                mat2[y]=(int*)malloc(m*sizeof(int));
            }

        //inpur matrix 2
        printf("Enter the second matrix entries\n");
        for (c = 0; c <n; c++)
        {
            for (d= 0; d < n; d++)
            {
                scanf("%d", &mat2[c][d]);   
            }
        }

        //Memory allocate matrix Mult
        int **mult=(int**)malloc(m*sizeof(int));
        for(z=0;z<m;z++)
            mult[z]=(int*)malloc(m*sizeof(int));
        for (a = 0; a < n; a++)
        {
            for (d = 0; d < m; d++)
            {
                for (c = 0; c < n; c++)
                {
                    sum=sum + (mat1[a][c] *mat2[c][d]);
                }
                mult[a][d] = sum;
                sum= 0;
            }
        }
        printf("Product\n");

        for ( a = 0 ; a < n ; a++ )
        {
            for ( d = 0 ; d < m ; d++)
                printf("%d\t", mult[a][d]);
            printf("\n");
        }

    }
}  
void mxmult()
{
int n,m,a,b,c,d,和=0;
int x,y,z;
printf(“输入第一个订单[n*n]\n”);
scanf(“%d”和“&n”);
printf(“输入第二顺序[m*m]\n”);
scanf(“%d”、&m);
如果(n!=m)
{
printf(“无效订单”);
}
其他的
{
//为矩阵1分配内存
int**mat1=(int**)malloc(n*sizeof(int));


对于(x=0;x您是否尝试过使用1D数组?
int**
指的是指向
int
的指针,而您似乎试图将其用作
int
的二维矩阵。您尝试过使用1D数组吗?
int**
指的是指向
int
的指针,而您似乎正在尝试使用它将其转换为
int
sNo的二维矩阵。这将导致内存碎片。@MilesRout;那么您将如何创建二维数组?@MilesRout内存碎片与问题无关。在一些用例中,这是一种好方法,碎片不成问题。@MilesRout但不在这个问题中。有在C中有很多方法可以实现2D数组,但没有一种方法比另一种更好。它们只是有不同的折衷。没有理由在不需要的情况下增加答案的复杂性。@MilesRout我们知道OP想知道为什么他的malloc不起作用。我们不知道他最终打算如何使用它,也不应该做出假设。没有ne对于一个假设的约束条件,我们试图反驳这个答案,这对OP来说可能根本不重要。VLA也不是免费的。不,你不应该。这将导致内存碎片。@MilesRout;那么你将如何创建2D数组?@MilesRout内存碎片与这个问题无关。在一些用例中,这是一个很好的方法和碎片优化不是问题。@MilesRout但不是在这个问题上。在C中有很多方法可以实现2D数组,没有一种比其他方法更好。它们只是有不同的权衡。没有理由在不需要的时候增加答案的复杂性。@MilesRout我们都知道OP想知道为什么他的malloc不起作用。我们不知道他打算如何解决我们的问题最后,我们不应该做假设。没有必要因为一个假设的约束而抨击这个答案,这对OP来说可能根本不重要。VLA也不是免费的。@MilesRout是的,如果用户为
n
@user3386109输入一个大值,那么你可以使堆栈溢出。好吧,这是一个关于堆栈溢出的网站,否?-抱歉无法抵抗。感谢迈尔斯关于C99的补充。@MilesRout是的,如果用户为
n
@user3386109输入一个较大的值,您可以使堆栈溢出。这是一个关于堆栈溢出的网站,否?-抱歉无法抵抗。感谢迈尔斯关于C99的补充。