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

时间:2014-05-28 09:09:22

标签: c arrays pointers malloc dynamic-memory-allocation

这是我的代码。我的目的是在运行时将内存分配给 2D 数组,直到输入中给出的任何大小。

为什么分段错误发生?是因为数组元素必须连续存储 malloc (动态分配)是不是要让这种情况发生? OR 我在编写此代码时遇到了一些错误。请指导我。 提前谢谢。

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;
}

4 个答案:

答案 0 :(得分:3)

这是一个经典错误。

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

当然,您可以通过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) );

如果可能的话,你应该尝试避免这种情况,而不是实际的二维数组,从C99开始,你可以在堆栈上声明,即使它的大小是在运行时确定的:

int main()
{
    int n;
    scanf("%d", &n);
    int array[n][n];
    // ...
    return 0;
}

答案 1 :(得分:2)

您应该像这样分配:

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

不要忘记使用free释放记忆。


旁注:不要转换malloc的返回值。

答案 2 :(得分:1)

一个可行的想法,也可以让你摆脱这个双指针级别分配引起的内存碎片,使你的矩阵成为线性的:

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

然后只需使用arr [i * size + j]而不是arr [i] [j]访问您的元素:

答案 3 :(得分:0)

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

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");
        }

    }
}