C:无效的内存访问[关闭]

svmlkihl  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(81)

已关闭此问题为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;
}
ivqmmu1c

ivqmmu1c1#

对于一个给定的长度为n的数组arrarr[n]将始终超出边界,因为数组的索引从0开始。越界调用未定义的行为。标准没有说应该发生什么,所以把它当作 * 任何 * 可能发生的事情。
在这种情况下,它似乎导致了分段故障。

result = result + factorial(array[z]);

应为:

result += factorial(array[i]);

变量i * 是 * 约束的,因此它不会超出边界。
还要注意,在factorial中递归的基本情况是x01,递归通过 * 向下计数 * 收敛于这个基本情况。但是如果x开始小于0,递归将是无限的,并且可能会失控,直到发生堆栈溢出。

goqiplq2

goqiplq22#

*上面代码中的小错误,请在for循环中将array[i]替换为array[z] 下面我提到了正确的代码,请参考它。

#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 += factorial(array[i]); // error fix in here,
    }

    return result;
}

相关问题