繁体   English   中英

这就是他们所谓的“堆栈溢出”吗?

[英]Is this what they call a “Stack Overflow”?

所以我一直在尝试用C实现Euler项目,因为我是受虐狂,但实际上一直很好,直到问题8为止:

int problem_8 () {
    int max = 0;
    const char* nums[] = {"73167176531330624919225119674426574742355349194934"
                        "96983520312774506326239578318016984801869478851843"
                        "85861560789112949495459501737958331952853208805511"
                        "12540698747158523863050715693290963295227443043557"
                        "66896648950445244523161731856403098711121722383113"
                        "62229893423380308135336276614282806444486645238749"
                        "30358907296290491560440772390713810515859307960866"
                        "70172427121883998797908792274921901699720888093776"
                        "65727333001053367881220235421809751254540594752243"
                        "52584907711670556013604839586446706324415722155397"
                        "53697817977846174064955149290862569321978468622482"
                        "83972241375657056057490261407972968652414535100474"
                        "82166370484403199890008895243450658541227588666881"
                        "16427171479924442928230863465674813919123162824586"
                        "17866458359124566529476545682848912883142607690042"
                        "24219022671055626321111109370544217506941658960408"
                        "07198403850962455444362981230987879927244284909188"
                        "84580156166097919133875499200524063689912560717606"
                        "05886116467109405077541002256983155200055935729725"
                        "71636269561882670428252483600823257530420752963450"};
    for (int i = 0; i < 996; i++) {
        int k = 1;
        for (int j = 0; j < 5; j++) {
            k *= atoi(nums[i+j]);
        }
        if (k > max)
            max = k;
    }

    return max;
} 

当我调用problem_8()时,该程序立即崩溃。 谷歌说我应该在堆上动态创建数组,而不是使用堆栈,但是我一直很难弄清楚该怎么做,因为我从未真正涉足过动态内存分配(我来自Java背景) )。 我是否只使用malloc()为数组分配了千字节的内存? 我该如何完成?

编辑:因此,事实证明 const char* nums[]应该是const char nums[] ,而不是atoi(nums[i+j])我应该使用nums[i+j]-'0' ,现在可以正常工作了。 忽略所有告诉我将逗号添加到数组的答案。

嗯,您意识到这是一个1元素的数组,对吗? 因此,一旦您使用除0以外的任何值编制索引,您就会超出范围并导致未定义的行为。 我想您缺少逗号。

我没有阅读该问题的要求; 如果应该是单个长字符串,则nums的类型是错误的。 它应该是一个char数组:

const char nums[] = "...

不是char指针数组:

const char *nums[] = "...
           ^
           |
      has meaning!

这与堆栈溢出无关。

由于您正在访问不存在的nums条目而导致崩溃。 更准确地说, nums是仅包含一个字符串nums[0]的字符串数组。 通过使用const char* nums =修复此问题。

您还需要将atoi调用更改为nums[i+j]-'0'

固定版本如下所示

...
for (int i = 0; i < 996; i++) {
    int k = 1;
    for (int j = 0; j < 5; j++) {
        k *= nums[i+j]-'0';
    }
    if (k > max)
        max = k;
}
...

它找到的最大值是40824。

不,这不是堆栈溢出而是逻辑错误,请尝试添加逗号。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM