已关闭此问题为not reproducible or was caused by typos。它目前不接受回答。
此问题是由打印错误或无法再重现的问题引起的。虽然类似的问题可能是on-topic在这里,这一个是解决的方式不太可能帮助未来的读者。
上个月关门了。
Improve this question
我是C数组的新手,我面临着一个问题,我的代码返回无效内存访问的错误。
以下是确切的错误:
“捕捉到意外信号:SIGSEGV(11).无效的内存访问。”
下面是我的代码:
#include <stddef.h>
int factorial(int x) {
if (x == 0 || x == 1) {
return 1;
}
else {
return x * factorial(x - 1);
}
}
unsigned long long sum_factorial(size_t z, const int array[z]) {
unsigned long long result = 0;
for (size_t i = 0; i < z; ++i) {
result = result + factorial(array[z]);
}
return result;
}
2条答案
按热度按时间ivqmmu1c1#
对于一个给定的长度为
n
的数组arr
,arr[n]
将始终超出边界,因为数组的索引从0
开始。越界调用未定义的行为。标准没有说应该发生什么,所以把它当作 * 任何 * 可能发生的事情。在这种情况下,它似乎导致了分段故障。
应为:
变量
i
* 是 * 约束的,因此它不会超出边界。还要注意,在
factorial
中递归的基本情况是x
是0
或1
,递归通过 * 向下计数 * 收敛于这个基本情况。但是如果x
开始小于0
,递归将是无限的,并且可能会失控,直到发生堆栈溢出。goqiplq22#
*上面代码中的小错误,请在for循环中将array[i]替换为array[z] 下面我提到了正确的代码,请参考它。