C - 具有动态分配的分段故障

时间:2014-09-11 12:43:58

标签: c segmentation-fault dynamic-memory-allocation fault saddle

我正在做这个程序来找到矩阵的鞍点(元素列上的数字最多,同时行上的最小数字)

所以,这就是问题,我遇到了分段错误。当使用Windows时,它实际上工作正常,但是当我要在Ubunto上运行时,它不起作用。我不幸的是,我的机器上只有窗户,所以我无法弄清楚它为什么不起作用或哪里出错了。

你可以帮帮我吗?告诉我代码有什么问题,或者错误在哪里!

int main(){
    int i, j, *ml, *mc, key = 1, z;
    int ordem, **me;
    char car;

    /* ml = smallest of each row, mc = greatest of each column
     * me = given matrix 
     * ordem = size of matrix */

    scanf("%d", &ordem);

    me = malloc(ordem * sizeof(int));
    for(i = 0; i < ordem; i++){
        me[i] = malloc(ordem * sizeof(int));
    }
    ml = malloc (ordem * sizeof(int));
    mc = malloc (ordem * sizeof(int));

    for(i = 0; i < ordem; i++){
        scanf("%d", &me[i][0]);
        for(j = 1; j < ordem; j++){
            scanf(" %d", &me[i][j]);
        }
        do{
            z = scanf("%c", &car);
        }while ((z != EOF) && (car != '\n'));
    }

如果有必要,我可以给你们其余的代码,但我很确定错误发生在那里,无论是在malloc还是scanf上。

非常感谢,非常感谢任何帮助!最好的问候!

3 个答案:

答案 0 :(得分:1)

int **me;
me = malloc(ordem * sizeof(int));

这是错误的!它的:

me = malloc(ordem * sizeof(int*));

总是仔细检查你的malloc,90%的segfault comme来自这里...

答案 1 :(得分:1)

你的问题可能在线

me = malloc(ordem * sizeof(int));

meint**,因此您需要分配int*,而不是int

这给您带来了可移植性问题,因为不同的编译器不一定对这些数据类型使用相同的大小。尝试在不同的计算机上运行此代码以测试正在进行的操作。

printf("The size of an int  is %d\n", sizeof(int));
printf("The size of an int* is %d\n", sizeof(int*));

一种可以修改编码风格的方法,以便更容易犯这个错误,就是在你的sizeof中使用变量名称

me = malloc(ordem * sizeof(*me));

通过这种方式,您可以直观地看到您为ordem所指向类型的me变量分配空间。

答案 2 :(得分:0)

分配指针数组时,需要获取指针的元素大小,而不是int。在你的Ubuntu系统上,指针大小可能是64位,而整数仍然是32,而在Windows上,它们的大小与传统情况相同。