使用冒泡排序同步排序数组与Vector结构体时出现段错误的解决方法
问题解决:冒泡排序时的段错误及逻辑修正
你遇到的段错误和逻辑问题主要来自三个关键错误,以下是具体分析和修复方案:
1. 错误的Vector结构体访问方式
在bubble_sort_date函数中,你错误地将单个Vector指针当作数组访问:
swap_vector(..., &vec_date_present[j].array, &vec_date_present[j+1].array);
vec_date_present是指向单个Vector实例的指针,vec_date_present[j]会访问指针偏移j个结构体大小的内存,这完全超出了malloc分配的空间,直接触发段错误。
正确的做法是访问Vector内部的array数组元素,传递数组元素的地址即可:
swap_vector(&vec_dates_time[j], &vec_dates_time[j+1], &vec_date_present->array[j], &vec_date_present->array[j+1]);
2. 错误的size_array初始化值
在main函数中,你将vec_date_present->size_array设为0,但实际数据量是VECSIZE。由于size_t是无符号类型,0-1会变成极大的正数,导致排序循环执行次数远超预期,引发内存越界。
修正为:
vec_date_present->size_array = VECSIZE;
3. 错误的索引交换逻辑
swap_vector函数中对索引的交换逻辑完全错误,你操作的是指针本身而非数组元素的值。正确的交换应该直接交换两个size_t值:
修正后的swap_vector:
void swap_vector(double* date1, double* date2, size_t* idx1, size_t* idx2) { // 交换double值 double dtemp = *date1; *date1 = *date2; *date2 = dtemp; // 交换索引值 size_t utemp = *idx1; *idx1 = *idx2; *idx2 = utemp; }
完整修正后的代码
#include <stdio.h> #include <stdlib.h> #define VECSIZE 6 typedef struct { size_t size_array; size_t *array; } Vector ; void swap_vector(double* date1, double* date2, size_t* idx1, size_t* idx2) { double dtemp = *date1; *date1 = *date2; *date2 = dtemp; size_t utemp = *idx1; *idx1 = *idx2; *idx2 = utemp; } void bubble_sort_date(Vector *vec_date_present, double *vec_dates_time) { int i, j; for (i = 0; i < vec_date_present->size_array - 1; i++) for (j = 0; j < vec_date_present->size_array - i - 1; j++) if (vec_dates_time[j] > vec_dates_time[j+1]) swap_vector(&vec_dates_time[j], &vec_dates_time[j+1], &vec_date_present->array[j], &vec_date_present->array[j+1]); } int main() { Vector *vec_date_present = (Vector *) malloc(sizeof(Vector)); vec_date_present->array = (size_t *) malloc(VECSIZE * sizeof(size_t)); vec_date_present->size_array = VECSIZE; // 修正初始化值 double *vec_dates_time = (double *) malloc(VECSIZE*sizeof(double)); size_t i; for (i= 0; i<VECSIZE; i++) { vec_date_present->array[i] = i; } vec_dates_time[0] = 2.3; vec_dates_time[1] = 0.2; vec_dates_time[2] = 5.8; vec_dates_time[3] = 1.2; vec_dates_time[4] = 0.1; vec_dates_time[5] = 9.2; printf("Non sorted:\n"); for (i= 0; i<VECSIZE; i++) { printf("%zu: %.1f\n", vec_date_present->array[i], vec_dates_time[i]); } bubble_sort_date(vec_date_present, vec_dates_time); printf("Sorted:\n"); for (i= 0; i<VECSIZE; i++) { printf("%zu: %.1f\n", vec_date_present->array[i], vec_dates_time[i]); } free(vec_date_present->array); free(vec_date_present); free(vec_dates_time); return 0; }
运行结果
Non sorted: 0: 2.3 1: 0.2 2: 5.8 3: 1.2 4: 0.1 5: 9.2 Sorted: 4: 0.1 1: 0.2 3: 1.2 0: 2.3 2: 5.8 5: 9.2
(注:你给出的预期输出中3: 1.2的位置有误,正确排序后1.2应在2.3之前)
内容的提问来源于stack exchange,提问作者ecjb
相关产品推荐
相关产品推荐

