我有一个分段错误,但我没有找到oO?

它应该与合并排序。 合并和排序合并有两个function。 一些未知的函数(从文件和打印数组中读取数组)在输入文件中完全起作用。

Valgrind向我展示了失败是在array2的分配以及它在void合并的第3个while循环中的读写时。

void merge(int* array, int start, int middle, int end) { int size = end - start + 1; int *array2 = malloc(size*sizeof(array2)); int k = start; int m = middle + 1; int i = 0; int j = 0; while ( k <= middle && m <= end ) { if ( array[k] <= array[m] ) { array2[i] = array[k]; k++; } else { array2[i] = array[m]; m++; } i++; } while ( k <= middle ) { array2[i] = array[k]; k++; i++; } while ( m <= end ) { array2[i] = array[k]; k++; i++; } while ( j < i ) { array[ start + j -1 ] = array2[j]; j++; } free(array2); } void merge_sort(int* array, int first, int last) { int middle; if ( first < last ) { middle = ((first+last) / 2); merge_sort (array, first, middle); merge_sort (array, middle + 1, last); merge (array, first, middle, last); } } int main (int argc, char *argv[]) { if (argc!=3) { printf ("usage: %s  \n", argv[0]); exit(2); } char *filename = argv[2]; int *array; int size = atoi(argv[1]); array = malloc(size*sizeof(array)); int len = read_array_from_file(array, atoi(argv[1]), filename); printf("Eingabe:\n"); print_array(array, len); merge_sort(array, array[0], len); printf("Sortiert:\n"); print_array(array, len); free(array); return 0; } 

至少这是错的:

 int *array2 = malloc(size*sizeof(array2)); 

我想你的意思是:

 int *array2 = malloc(size * sizeof(*array2)); 

您希望分配size以每个条目的大小,而不是数组指针的大小。

但是(在64位计算机上)这实际上会使您的arrays占字节数的一半,从而导致您的超限发生得更快。 您有一个逻辑错误需要通过使用调试器单步执行代码来弄清楚。