【发布时间】:2018-09-10 08:25:10
【问题描述】:
我在使用两种不同的递归求和方法时遇到问题,在某些时候都失败并返回分段错误错误。第一个,sum_a 只在高值上失败,通过了 260000,我不知道为什么,第二个 sum_b 总是失败。任何帮助将不胜感激。
谢谢
执行如下:./sum a x
其中 x 是 SUM(1:x) 所需的递归次数,a 是 a 或 b
#include <signal.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
unsigned count=0;
void signal_segv_handler(int sig) {
char s[50];
sprintf(s, "Segmentation fault! count=%u\n", count);
write(2, s, strlen(s));
_exit(1);
}
unsigned long long *sum_b(unsigned long long x) {
unsigned long long *s;
count++;
if (x>0)
*s = *sum_b(x - 1) + x;
else
*s = 0;
return s;
}
unsigned long long sum_a(unsigned long long x) {
count++;
if (x>0)
return sum_a(x - 1) + x;
else
return 0;
}
int main(int argc, char** argv) {
unsigned long long x;
unsigned long long *sum_result;
char result[100];
static char stack[SIGSTKSZ];
stack_t ss = {
.ss_size = SIGSTKSZ,
.ss_sp = stack,
};
struct sigaction sa = {
.sa_handler = signal_segv_handler,
.sa_flags = SA_ONSTACK
};
sigaltstack(&ss, 0);
sigfillset(&sa.sa_mask);
sigaction(SIGSEGV, &sa, 0);
if (argc < 3) {
printf("Please specify the sum function to use (a or b) and the target number of integers to sum.\n");
return -1;
}
x = atoi(argv[2]);
if (strcmp(argv[1], "a") == 0)
sprintf(result, "sum_a = %llu for x=%llu, count=%u \n", sum_a(x), x, count);
else if (strcmp(argv[1], "b") == 0) {
sum_result = sum_b(x);
sprintf(result, "sum_b = %llu for x=%llu, count=%u \n", sum_result, x, count);
free(sum_result);
}
else {
printf("error: function must be a or b\n");
return -1;
}
write(1, result, strlen(result));
return 0;
}
【问题讨论】:
-
Sum_a 由于 stackoverflow 失败。您的方法堆栈会添加越来越多的方法,直到达到限制。
-
@Thomas 谢谢,但有什么限制?为什么总是在 260000 左右,我该如何解决?
-
我不知道限制...我认为您可以在 IDE 中更改限制...
-
但是你为什么要用递归来做呢?这只是一个总和......所以通常的循环也可以工作
-
但是你为什么要用递归来做呢?这只是一个总和......所以通常的循环也可以工作
标签: c recursion sum segmentation-fault