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

C语言数组去重代码循环中出现segmentation error,求修复方法

修复数组去重代码的段错误问题

核心错误分析

你的代码触发段错误的直接原因是参数传递类型不匹配:在find_duplicates函数中调用remove_duplicates时,第二个参数传的是*size1(数组长度的数值),但remove_duplicates的第二个参数要求是指针类型。把数值当成内存地址解引用,会直接访问非法内存,导致段错误。

此外,移除重复元素后,循环索引未做调整,会导致跳过部分元素的检查。


修复后的完整代码

#include<stdio.h>

void remove_duplicates(int arr[], int *size1, int index)
{
    for(int j = index; j < *size1 - 1; j++)
    {
        arr[j] = arr[j+1];
    }
    (*size1)--;
}

void find_duplicates(int arr[], int *size1)
{
    for(int i = 0; i < *size1; i++)
    {
        for(int j = i + 1; j < *size1; j++)
        {
            if(arr[i] == arr[j])
            {
                // 修复:传递指针而非数值,确保函数能正确修改数组长度
                remove_duplicates(arr, size1, j);
                // 修复:移除元素后回退索引,避免跳过新移到当前位置的元素
                j--;
            }
        }
    }
}

int main()
{
    int arr[] = {1,3,4,5,4,3,2,5,2};
    int size = sizeof(arr)/sizeof(int);
    int *size1 = &size;
    find_duplicates(arr, size1);
    for(int i = 0; i < *size1; i++)
        printf("%d ", arr[i]); // 加空格优化输出可读性
    return 0;
}

关键修复说明

  1. 参数传递修正:将remove_duplicates(arr,*size1,j);改为remove_duplicates(arr, size1, j);,传递数组长度的指针,让remove_duplicates能安全修改数组的实际长度。
  2. 循环索引调整:移除重复元素后执行j--,因为原j+1位置的元素会移到j位置,这个新元素可能仍与arr[i]重复,回退索引可避免漏检。
  3. 输出优化:在printf中添加空格,让去重后的数字输出更易读。

运行结果

修复后代码运行输出:1 3 4 5 2 ,完全符合数组去重的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 03:20:23