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



这是我的代码。我的目的是在运行时将内存分配给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("%dn",matrix[i][j]);
        }
    }
    */
    return 0;
}

这是个典型的错误。

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

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

你应该这样分配:

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

不要忘记使用free释放内存。


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

一种有效的方法,也可以让你摆脱由双指针级别分配引起的内存碎片,使你的矩阵线性:

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 entriesn");
        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 entriesn");
        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("Productn");
        for ( a = 0 ; a < n ; a++ )
        {
            for ( d = 0 ; d < m ; d++)
                printf("%dt", mult[a][d]);
            printf("n");
        }
    }
}  

相关内容

  • 没有找到相关文章

最新更新