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

结构体数组归并排序时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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 05:26:04