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; }
关键修复说明
- 参数传递修正:将
remove_duplicates(arr,*size1,j);改为remove_duplicates(arr, size1, j);,传递数组长度的指针,让remove_duplicates能安全修改数组的实际长度。 - 循环索引调整:移除重复元素后执行
j--,因为原j+1位置的元素会移到j位置,这个新元素可能仍与arr[i]重复,回退索引可避免漏检。 - 输出优化:在
printf中添加空格,让去重后的数字输出更易读。
运行结果
修复后代码运行输出:1 3 4 5 2 ,完全符合数组去重的需求。
内容的提问来源于stack exchange,提问作者Ravi
相关产品推荐
相关产品推荐

