Xcode执行后崩溃报SIGABRT信号,编译出现错误码0x7fff6acd623e求助
C语言筛素数代码触发SIGABRT崩溃,编译时出现跳转地址错误的解决方案
问题描述
我在运行一段C语言筛素数代码时,编译出现了
0x7fff6acd623e <+10>: jae 0x7fff6acd6248 ; <+20>的错误提示,Xcode执行后直接崩溃,触发了signal SIGABRT信号。代码如下:
#include <stdio.h> int main() { int arr[100], i, j = 2, jump, k, sum =0 ; for (i = 0; i < 100; i++) //input numbers from 2 -> to limit of arrSize arr[i] = j++; for (i = 0; i < 100; i++) //if the value of arr[i] isnt already = 0, then jump { //will get the value of i (e.g. 3), and jump 3 steps, if (arr[i] != 0) //not including 0 values. { jump = arr[i]; for (k = jump; k < 100; k+=jump) //then it will assign value 0. arr[i+k] = 0; } else continue; //if arr[i] = 0, it will go to the next iteration } for (i = 0; i < 100; i++) //print all numbers. the not-prime will be 0. printf("%d\n ", arr[i]); //it can be improved by copying not 0 values to other arr //but for summing up it don't make any different. }
问题根源:数组越界+筛法逻辑错误
你看到的0x7fff开头的地址是系统内核处理内存非法访问的跳转标记,真正的崩溃原因是代码中的数组越界访问——这属于C语言中的未定义行为,系统检测到后会直接发送SIGABRT信号终止程序。
具体看这段出问题的代码:
for (k = jump; k < 100; k+=jump) arr[i+k] = 0;
你的数组arr长度为100,合法下标范围是0~99,但当i + k的和超过99时(比如i=50时,jump=arr[50]=51,第一次循环k=51,i+k=101),就会访问数组以外的内存,直接触发崩溃。
另外,这段筛素数的逻辑本身也有问题:你想标记当前素数的倍数,但arr[i+k]的写法完全偏离了需求——arr[i]是当前素数(比如arr[0]=2),它的倍数应该是4、6、8...,对应的数组下标应该是2、4、6...,而不是i+k这种错误的计算方式。
修复方案
下面是修正后的代码,同时解决了数组越界和逻辑错误的问题:
#include <stdio.h> int main() { int arr[100], i, j = 2, jump, k, sum = 0; // 初始化数组:arr[i] = i+2,对应数值2~101 for (i = 0; i < 100; i++) arr[i] = j++; // 埃氏筛核心逻辑 for (i = 0; i < 100; i++) { if (arr[i] != 0) { // 当前数是未被标记的素数 jump = arr[i]; // 标记当前素数的所有倍数:从2*jump开始,直到<=101 // 通过k-2转换为数组下标,确保下标始终在0~99范围内 for (k = 2 * jump; k <= 101; k += jump) { int target_idx = k - 2; arr[target_idx] = 0; } } } // 只打印非0的素数(优化了原代码的输出逻辑) for (i = 0; i < 100; i++) { if (arr[i] != 0) { printf("%d ", arr[i]); } } return 0; }
关键修复点
- 修正数组下标计算:通过
k-2将数值转换为对应的数组下标,确保所有访问都在0~99的合法范围内,彻底避免越界。 - 修复筛法逻辑:从当前素数的2倍开始标记倍数,符合埃氏筛的正确逻辑,能准确筛选出所有素数。
- 优化输出逻辑:只打印非0的素数,避免输出大量无意义的0值。
修改后程序就能正常运行,正确筛选出2~101之间的所有素数,不会再触发SIGABRT崩溃。
内容的提问来源于stack exchange,提问作者David Frucht
相关产品推荐
相关产品推荐

