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

实现无序列组去重函数int different时遇段错误,求技术帮助

解决different函数的段错误问题:提取数组中仅出现一次的元素

看起来你在实现这个提取唯一元素的函数时遇到了段错误,这类问题大多是非法内存访问导致的,我来帮你梳理常见问题点并给出完整的修正实现。

常见段错误触发原因

段错误通常是因为程序访问了不允许的内存区域,针对这个函数,大概率是以下情况之一:

  • 没有正确给输出数组分配动态内存,或者对vetout这个二级指针的处理有误
  • 统计元素出现次数时,数组索引越界
  • 往输出数组写入数据时,超出了分配的内存范围

修正后的完整代码实现

#include<stdio.h>
#include<stdlib.h>

int different(int input[], int size, int **vetout) {
    // 第一步:先统计数组中仅出现一次的元素总数
    int uniqueCount = 0;
    for (int i = 0; i < size; i++) {
        int isUnique = 1;
        // 检查当前元素是否在数组其他位置出现过
        for (int j = 0; j < size; j++) {
            if (i != j && input[i] == input[j]) {
                isUnique = 0;
                break;
            }
        }
        if (isUnique) {
            uniqueCount++;
        }
    }

    // 为输出数组分配动态内存
    *vetout = (int *)malloc(uniqueCount * sizeof(int));
    if (*vetout == NULL) {
        // 内存分配失败时返回0,避免后续非法访问
        return 0;
    }

    // 填充输出数组,只保留仅出现一次的元素
    int currentIndex = 0;
    for (int i = 0; i < size; i++) {
        int isUnique = 1;
        for (int j = 0; j < size; j++) {
            if (i != j && input[i] == input[j]) {
                isUnique = 0;
                break;
            }
        }
        if (isUnique) {
            (*vetout)[currentIndex++] = input[i];
        }
    }

    return uniqueCount;
}

int main() {
    // 测试用例
    int input[] = {1, 2, 3, 2, 4, 1, 5};
    int size = sizeof(input) / sizeof(input[0]);
    int *outputArr = NULL;
    
    int resultSize = different(input, size, &outputArr);
    
    // 打印结果
    printf("去重后数组大小:%d\n", resultSize);
    printf("数组元素:");
    for (int i = 0; i < resultSize; i++) {
        printf("%d ", outputArr[i]);
    }
    printf("\n");

    // 记得释放动态分配的内存,避免内存泄漏
    free(outputArr);
    outputArr = NULL;

    return 0;
}

关键修正点说明

  • 正确处理动态内存:

    • 先统计唯一元素的数量,再根据这个数量分配对应大小的内存,避免内存不足或浪费
    • 必须检查malloc的返回值,如果分配失败直接返回0,防止后续操作访问空指针
    • 主函数中要传入输出指针的地址(&outputArr),这样函数内部才能修改这个指针指向新分配的内存
  • 避免数组越界:

    • 所有循环的索引都严格控制在0到size-1之间,防止访问数组外的内存
    • 填充输出数组时用currentIndex跟踪写入位置,确保不超过分配的内存范围
  • 内存泄漏预防:

    • 主函数中使用完动态数组后,一定要调用free释放内存,并将指针置为NULL

可选优化方向

上面的实现用了双重循环,时间复杂度是O(n²),如果你的数组元素范围较大或者数组长度很长,可以用哈希表来优化时间复杂度到O(n)(比如借助C的第三方哈希库uthash,或者自己实现简单的哈希表),不过上面的版本是最基础、不依赖额外库的实现,适合理解核心逻辑。

内容的提问来源于stack exchange,提问作者Alex97

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:44:30