使用malloc时出现分段错误

时间:2014-05-05 13:55:41

标签: c arrays segmentation-fault malloc

我在这里询问了我的问题The largest size of 2-D array in C以及在得到某些人声明重复之前我得到了什么答案,我修改了我的代码:

#include<stdio.h>
#include<stdlib.h>

int main()
{
    int i,j,n,m,p = 0 ;
    int sum[100000] = {0};

    scanf("%d%d%d",&n,&m,&p);

    /*for ( i = 0 ; i < n ; i++ )
    {
        for( j = 0 ; j < m ; j++ )
        {
            a[i][j] = j + 1 ;
        }
    }*/
    int **a = (int **) malloc(sizeof(int)*n);
    for(i=0; i<n; i++)
    {
        a[i] = (int *) malloc(sizeof(int)*m); 

       for(i=0; i<n; i++){
           for(j=0; j<m; j++){
            a[i][j] = j + 1 ;

           }
       }

    }
    return 0;
}

但我仍然得到相同的分段错误。请帮我修复它,我希望这个问题不会被声明为重复。 :P

2 个答案:

答案 0 :(得分:5)

你告诉malloc()错误的尺寸。

此:

int **a = (int **) malloc(sizeof(int)*n);

应该是:

int **a = malloc(n * sizeof *a);

Don't cast the result of malloc(),并在返回指针指向的类型上使用sizeof,即int *,其大小可能与系统上的int不同。

因此,因此:

a[i] = (int *) malloc(sizeof(int)*m); 

应该是:

a[i] = malloc(m * sizeof *a[i]);

在依赖指针有效之前,添加代码以确保所有malloc()成功,即永不返回NULL。同时确保初始scanf()返回3,并打印出nmp的值。同时删除sum

答案 1 :(得分:0)

int **a = (int **) malloc(sizeof(int)*n);错了。你想要的是一个指针数组,所以你应该改为int **a = (int **) malloc(sizeof(int *)*n);