结构体数组归并排序时arrayCopy函数出现段错误求助
结构体数组归并排序的段错误排查与修复
我尝试对结构体数组执行归并排序,过程中多次出现段错误,目前错误集中在arrayCopy函数中,调整细节后问题仍未解决。
完整代码
typedef struct { char Nome[50]; //来自ruas.txt文件 unsigned int int_arr[6]; char char_arr[6]; } Arteria; typedef struct { Arteria arteria; int cont; } item10array; void structCopy(item10array dest, item10array src) { strcpy(dest.arteria.Nome, src.arteria.Nome); for (int j = 0; j < 6; j++) { dest.arteria.int_arr[j] = src.arteria.int_arr[j]; dest.arteria.char_arr[j] = src.arteria.char_arr[j]; } dest.cont = src.cont; } void arrayCopy(item10array dest[], item10array src[], const int lenght, const int leftShift) { for (int i = 0; i < lenght; i++) { structCopy(dest[i], src[leftShift + i]); } } void mergeSorted(item10array *array, const int l, const int m, const int r) { int left_lenght = m - l + 1; int right_lenght = r - m; item10array temp_left[left_lenght]; item10array temp_right[right_lenght]; int i, j, k; arrayCopy(temp_left, array, left_lenght, l); arrayCopy(temp_right, array, right_lenght, m + 1); for (i = 0, j = 0, k = l; k <= r; k++) { if ((i < left_lenght) && (j >= right_lenght || temp_left[i].cont <= temp_right[j].cont)) { structCopy(array[k], temp_left[i]); i++; } else { structCopy(array[k], temp_right[j]); j++; } } } void sortRecursion(item10array *arrray, int l, int r) { //这段本来没必要,但求个心安 if (r <= 1) return; if (l < r) { //找到数组中点 int m = l + (r - l) / 2; sortRecursion(arrray, l, m); sortRecursion(arrray, m + 1, r); mergeSorted(arrray, l, m, r); } } void sortItem10(item10array *rua, int lenght) { sortRecursion(rua, 0, lenght - 1); } void item10letra(Arteria *origin_ptr) { item10array rua[345] = {{"0", 0, 0, 0}}; for (int i = 0; i < 345; i++) { rua[i].arteria = origin_ptr[i]; } char letra; int cont = 0; int lenght = sizeof(item10array) * 345; for (int i = 0; i < 345; i++) { rua[i].arteria = origin_ptr[i]; } for (int i = 0; i < 345; i++) { for (int j = 0; j < 6 && rua[i].arteria.char_arr[j] != 0; j++) { if (rua[i].arteria.char_arr[j] == letra) { cont++; } } rua[i].cont = cont; } sortItem10(rua, lenght); }
错误原因与修复方案
- 长度参数传递错误:在
item10letra中,lenght = sizeof(item10array) * 345计算的是数组总字节数,但sortItem10需要的是元素个数(345)。传入字节数会让排序函数处理远超数组实际长度的元素,直接触发内存越界,引发段错误。修复:将int lenght = sizeof(item10array) * 345;改为int lenght = 345;。 - 递归终止条件错误:
sortRecursion中if (r <= 1) return;逻辑错误,正确的终止条件应为if (l >= r) return;。原条件会导致部分子数组未被正确处理,甚至引发递归边界计算错误。 - 结构体拷贝效率与参数问题:
structCopy采用传值方式,会拷贝整个结构体,虽然不会直接引发段错误,但效率低下。建议改为传指针:
同时修改void structCopy(item10array *dest, const item10array *src) { strcpy(dest->arteria.Nome, src->arteria.Nome); for (int j = 0; j < 6; j++) { dest->arteria.int_arr[j] = src->arteria.int_arr[j]; dest->arteria.char_arr[j] = src->arteria.char_arr[j]; } dest->cont = src->cont; }arrayCopy和mergeSorted中的调用:structCopy(&dest[i], &src[leftShift + i]);、structCopy(&array[k], &temp_left[i]);等。 - 未初始化变量:
item10letra中char letra;未赋值就用于比较,导致cont计算结果随机,属于逻辑错误。需要先给letra赋值(比如char letra = 'a';,根据实际需求设置)。 - 冗余代码:
item10letra中连续两次对rua[i].arteria赋值,删除其中一次即可。
内容的提问来源于stack exchange,提问作者Baguaguy
相关产品推荐
相关产品推荐

