gpt4 book ai didi

c - Mergesort - 段错误

转载 作者:太空宇宙 更新时间:2023-11-04 01:21:30 25 4
gpt4 key购买 nike

代码目录结构,

./Computing$ ls -LR
.:
list file.txt mergeSort.c program.exe type.h

./list:
arrayImpl.c linkedListImpl.c list.h

编译过程:

$./Computing
gcc -Wall -Werror -DARRAY -I. mergeSort.c ./list/*.c -o program

Here是包含文件的完整代码,mergeSort.c, list/*, type.h

List的给定表示,

typedef struct List{
void **array;

/* Housekeeping - Array enhancement/shrink */
int lastItemPosition;
int size;
}List;

mergesort 在 list->array 上执行,其中 aux 维护 array 的浅拷贝

void mergeSort(List *list, size_t listSize, isLess less){

if(list != NULL){

void **aux = malloc(list->size * sizeof(void*)); //Auxillary shadow copy
if(aux != NULL){
printf("Size of list: %d\n", listSize);
mSort(list->array, aux, 0, listSize-1, less);
}else{

fprintf(stderr, "mergeSort() - Malloc failure");
exit(EXIT_FAILURE);
}
}else{

fprintf(stderr, "mergeSort() - List is NULL");
}
}

static void mSort(void **array, void **aux, int low, int high, isLess less){

if(high <= low) return;
int mid = (low + high)/2;

mSort(array, aux, low, mid, less);
mSort(array, aux, mid+1, high, less);
merge(array, aux, low, mid, high, less);
}

static void merge(void **array, void **aux, int low, int mid, int high, isLess less){

for(int index = 0; index <= high; index++){
aux[index] = array[index]; //Shallow copy
}
printf("Low-%d, Mid-%d, High-%d\n", low, mid, high);
int leftIndex = low; int rightIndex = mid+1;
printf("leftIndex-%d, rightIndex-%d\n", leftIndex, rightIndex);

for(int index = 0; index <= high; index++){

if(leftIndex > mid) /* right array exhausted */ array[index] = aux[rightIndex++];
else if(rightIndex > high) /*left array exhausted*/ array[index] = aux[leftIndex++];
else if( less(aux[rightIndex], aux[leftIndex]) ) array[index] = aux[rightIndex++];
else array[index] = aux[leftIndex++];
}

}

使用代码在哪里,


bool less(const void *key, const void *item){
printf("\nIn less function\n");
printf("left-%d, Right-%d\n\n", ((Record *)key)->age, ((Record *)item)->age);
if( ((Record *)key)->age < ((Record *)item)->age ){
printf("Return true\n");
return true;
}else{
printf("Return false\n");
return false;
}
}

int main(){
FILE *pFile = fopen("file.txt", "r");
checkHandleFailure(pFile, FILE_HANDLE_FAILURE);
char buf[MAX_RECORD_SIZE];
DBCache *cache = initCache(pFile);


readHeader(pFile, cache, buf);

readData(pFile, cache, buf);

printRecords(cache);

printf("Before calling mergesort() \n");
mergeSort(cache->records, listGetSize(cache->records), less);
}


实际输出为:

$ ./program.exe
Age,LastName,FirstName
------------------------------
50,B,A

30,A,B

20,X,D

10,F,A

90,V,E

60,N,M

Records#: 6
Before calling mergesort()
Size of list: 6
Low-0, Mid-0, High-1
leftIndex-0, rightIndex-1

In less function
left-30, Right-50

Return true
Low-0, Mid-1, High-2
leftIndex-0, rightIndex-2

In less function
left-20, Right-30

Return true
Low-3, Mid-3, High-4
leftIndex-3, rightIndex-4

In less function
left-90, Right-10

Return false
Low-3, Mid-4, High-5
leftIndex-3, rightIndex-5
Segmentation fault (core dumped)
In less function


如何解决这个问题?

Cygwin 不支持使用 gdb 的 coredump trace 格式,提供了 trace(上面)

最佳答案

merge 中的两个 for 循环应该从低开始,而不是从零开始。从 0 开始的第二个 for 循环可能导致段错误。从 0 开始的第一个 for 循环不应导致段错误,但它会消耗额外的时间。

static void merge(....)

/* ... */

for(int index = low; index <= high; index++){ // low not 0
aux[index] = array[index];
}

/* ... */

for(int index = low; index <= high; index++){ // low not 0
if(leftIndex > mid) /* ... */
/* ... */

关于c - Mergesort - 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41434564/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com