【发布时间】:2018-12-08 21:51:30
【问题描述】:
我有一个简单的冒泡排序程序,在 macOS 上编译时可以正常工作,但在 linux(使用 gcc)上编译时,在运行时会出现分段错误。 我很想知道为什么。
#include <stdio.h>
#include "alg_utils.h"
void bubble_sort(int *, int);
int main() {
int array[10] = {5, 10, 77, 1, -2, -61, 18, 14, 57, 7};
bubble_sort(array, 10);
print_array(array, 10);
return 0;
}
void bubble_sort(int *array, int len) {
int i, j;
for (i=0; i < len; i++) {
for (j=0; j < len; j++) {
if (array[j] < array[j-1])
swap(&array[j], &array[j-1]);
}
}
}
在 Mac 上:
~/Projects/Algorithms: gcc Bubblesort.c
~/Projects/Algorithms: ./a.out
-2 0 1 5 7 10 14 18 57 77%
在 Linux 上:
root#f95445bcd4e7:~/algos$ gcc Bubblesort.c
root#f95445bcd4e7:~/algos$ ./a.out
Segmentation fault
alg_utils.h 只有 swap() 和 print_array() 函数的定义。没什么疯狂的。
void print_array(int *, int);
void swap(int *, int *);
void swap(int *a, int *b) {
int temp = *b;
*b = *a;
*a = temp;
}
void print_array(int *array, int len) {
int i;
for (i=0; i < len; i++) {
printf("%4d", array[i]);
}
}
当我用 main(int argc, char *argv[]) 更改 main() 时,它也可以在 linux 上运行。
Linux (with main(int argc, char *argv[])
root#f95445bcd4e7:~/algos$ gcc Bubblesort.c
root#f95445bcd4e7:~/algos$ ./a.out
-2 1 1 5 7 10 14 18 57 77
所以我想:linux 不喜欢没有参数的 main...但是这样一个简单的 hello world 运行得很好。
#include <stdio.h>
int main() {
printf("hello world\n");
return 0;
}
所以,我很困惑。它是什么?也许 alg_utils?也许不同的c实现?我尝试使用 -std=c99 (和其他组合)进行编译,但无济于事。
有人知道吗?提前谢谢你
【问题讨论】:
-
array[j-1]对应于j=0是什么? -
是的,伙计,你说得对,算法搞砸了,我现在修好了。它不再在 linux 上崩溃。尽管如此,问题仍然存在。它以前在 mac 上是如何工作的(以及在带有 argc / argv [我什至不使用] 的 linux 上)?
-
那是因为你调用了 UB 并且 undefined 意味着任何事情都可能发生,包括程序似乎可以工作
-
澄清上述评论 - UB 通常是站在undefined behavior