我正在做这个程序来找到矩阵的鞍点(元素列上的数字最多,同时行上的最小数字)
所以,这就是问题,我遇到了分段错误。当使用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上。
非常感谢,非常感谢任何帮助!最好的问候!
答案 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));
me
是int**
,因此您需要分配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上,它们的大小与传统情况相同。