数组去重代码出现EXC_BAD_ACCESS错误求助(Code=1, address=0x30000008)
解决C语言数组去重时的EXC_BAD_ACCESS错误
核心错误原因
你触发EXC_BAD_ACCESS的直接原因是内层循环的增量写错了:
内层循环for (j = 0; j < 10; i++)里,循环增量应该是j++,但你写成了i++。这会导致i在每次内层循环时被疯狂递增,很快超过数组A的最大下标10(A长度为11,下标范围0-10),访问A[i]时越界访问了不属于数组的内存,直接触发内存访问错误。
其他需要修复的问题
除了这个致命错误,代码里还有几个潜在问题:
- 浮点数直接判等不严谨:用
A[i]==B[j]比较double类型值存在风险,浮点数存储和计算时会有精度误差,应该用差值的绝对值小于极小值判断,比如fabs(A[i] - B[j]) < 1e-6。 - 数组前移时越界:
for (c = j; c < 10; c++)中,当c=9时,c+1=10已经超出B数组的下标范围(B长度10,下标0-9),循环条件要改成c < 9。 - 输出变量错误:最后输出新数组时,你用了
B[c],但c是上一次循环的残留值,应该用循环变量B[j]。
修复后的完整代码
#include <math.h> #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { srand(time(NULL)); int i, j, c; double A[11]; double B[10]; // 生成数组A for (i = 0; i < 11; i++) { A[i] = rand() % 100; } // 生成数组B for (j = 0; j < 10; j++) { B[j] = rand() % 100; } // 打印原数组 printf("Array A[N]: \n"); for (i = 0; i < 11; i++) // 修复:原代码仅打印前10个元素,现在打印全部11个 { printf("%.2lf ", A[i]); } printf("\n Array B[M]: \n"); for (j = 0; j < 10; j++) { printf("%.2lf ", B[j]); } // 移除B中与A重复的元素 for (i = 0; i < 11; i++) { for (j = 0; j < 10; j++) // 修复:把i++改成j++ { // 修复:用浮点数安全比较方式 if (fabs(A[i] - B[j]) < 1e-6) { // 修复:循环条件改成c < 9,避免访问B[10] for (c = j; c < 9; c++) { B[c] = B[c+1]; } // 移除元素后回退j,避免跳过下一个元素 j--; } } } // 打印去重后的数组B printf("\n New array B[M]: \n"); for (j = 0; j < 9; j++) { printf("%.2lf ", B[j]); // 修复:用B[j]代替B[c] } return 0; }
额外说明
原代码打印数组A时仅循环10次,漏掉了第11个元素,修复时一并修正。另外,当前代码处理后B的有效长度固定按9输出,如果有多个重复元素,有效长度会更小,建议用变量跟踪B的当前有效长度,输出时更准确。
内容的提问来源于stack exchange,提问作者Lvrnnk
相关产品推荐
相关产品推荐

