【问题标题】:Why does my c code crash when run from VSCode terminal, but runs fine when run from gnome terminal?为什么我的 c 代码从 VSCode 终端运行时崩溃,但从 gnome 终端运行时运行良好?
【发布时间】:2021-02-08 21:18:19
【问题描述】:

当我从 Visual Studio Code 终端运行可执行文件时,内存似乎耗尽,然后我的计算机死机了。

但是当我从 gnome 终端运行它时一切都很好,并且我得到了所需的输出。

我还不了解 c 或 gmp.h 库。如果某处存在错误或我遗漏了什么,我不会感到惊讶,即使我发布的代码在不从 VSCode 运行时确实给了我正确的结果。

顺便说一句,在我的电脑上运行 N 666666 确实需要大约 1 分 43 秒。

// problem from: https://www.reddit.com/r/dailyprogrammer/comments/jfcuz5/20201021_challenge_386_intermediate_partition/
#include "gmp.h"
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

#define N 666666

mpz_t results[N + 1];

void segment(int n)
{
    if (n <= 1)
        return;
    if (mpz_cmp_ui(results[n - 1], 0) > 0)
        return;

    mpz_t result;
    mpz_t diff;
    mpz_init(result);
    mpz_init(diff);
    int i = 0;
    int seq = 1;
    int is_positive;

    while (n - seq >= 0)
    {
        segment(n - seq);
        is_positive = 1 - 2 * (i / 2 % 2);
        mpz_mul_si(diff, results[n - seq - 1], is_positive);
        mpz_add(result, result, diff);
        seq += (i % 2 > 0) ? i + 2 : (i + 2) / 2;
        i += 1;
        mpz_set_ui(diff, 0);
    }

    mpz_add_ui(results[n - 1], result, 0);
    mpz_clear(result);
    mpz_clear(diff);
    return;
}

int main(void)
{
    for (int i; i < N; i++)
    {
        mpz_init(results[i]);
    }
    mpz_set_ui(results[0], 1);
    mpz_set_ui(results[1], 1);

    for (int i; i <= N + 1; i++)
    {
        segment(i);
    }

    gmp_printf("Result: %Zd\n", results[N]);

    for (int i; i < N; i++)
    {
        mpz_clear(results[i]);
    }
}

【问题讨论】:

  • 除非您显示您的代码,否则没有人可以肯定地告诉您。这可能是您程序中的错误导致未定义行为(例如缓冲区溢出、内存损坏、内存泄漏、使用未初始化的变量等)。 UB 的本质是它可以在不同条件下以不可预测的方式运行。
  • 等一下,我会发的。以为我可能错过了 VSCode。
  • 如果您要发布崩溃的代码,最好使用调试器查看它在哪一行崩溃。
  • 所有for 循环都是错误的。 for (int i; i &lt;= N + 1; i++) 是未定义的行为,因为 i 未初始化。应该是for (int i=0; i &lt;= N + 1; i++)。此外,N+1 将导致 result[i-1] 访问越界内存。
  • 即使 i 没有被初始化。哦,好吧。不不不!不要有那种态度。即使它看起来“工作”,它也必须被修复而不是那样。使用未初始化的变量是未定义的行为。这意味着它可能随时失败。您应该了解这一点,因为您已经观察到正在发生的事情。 Undefined, unspecified and implementation-defined behavior

标签: c visual-studio-code


【解决方案1】:

代码具有未定义的行为,因为 for 循环未初始化 i 循环索引:for (int i; i &lt; N; i++) 此外,该数组具有N + 1 元素,因此初始化循环应该多运行一步,而段循环应该少走一步。

修改main()函数为:

int main() {
    for (int i = 0; i < N + 1; i++) {
        mpz_init(results[i]);
    }
    mpz_set_ui(results[0], 1);
    mpz_set_ui(results[1], 1);

    for (int i = 0; i < N + 1; i++) {
        segment(i);
    }

    gmp_printf("Result: %Zd\n", results[N]);

    for (int i = 0; i < N + 1; i++) {
        mpz_clear(results[i]);
    }
    return 0;
}

【讨论】:

  • 注意,segment(i) 可以运行到 N+1,因为它访问数组的 i-1。除此之外,感谢您指出索引错误。
猜你喜欢
  • 2020-09-09
  • 2018-07-09
  • 1970-01-01
  • 2016-05-26
  • 2014-12-20
  • 2019-09-06
  • 2019-02-21
  • 2022-08-22
  • 2018-06-19
相关资源
最近更新 更多