You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用冒泡排序同步排序数组与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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 04:27:21