-2

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

所以,事情就是这样,我遇到了分段错误。使用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 上。

非常感谢,非常感谢任何帮助!此致!

4

3 回答 3

1

你的问题可能已经上线

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

me是 a int**,所以你需要分配 for 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

于 2014-09-11T12:59:30.933 回答
1
int **me;
me = malloc(ordem * sizeof(int));

这是错误!它的 :

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

总是仔细检查你的 malloc,90% 的段错误来自这里......

于 2014-09-11T12:56:06.410 回答
0

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

于 2014-09-11T12:47:13.150 回答