【问题标题】:Basic C program has stopped working: just in time debugger基本 C 程序已停止工作:即时调试器
【发布时间】:2013-07-05 19:53:40
【问题描述】:

我现在正在学习 C,并从 wibit.com 复制了以下内容:

#include <stdio.h>

int main()
{
    int* n;
    *n = 20;
    printf("%i\n", *n);
    return 0;
}

我正在使用 GCC 并在 cmd 提示符下编译和运行,如下所示:

gcc prgrm.c -o prgrm.exe    #compiles without any errors
prgrm.exe

然后弹出错误说prgrm.exe已停止工作。我点击调试并得到这个:

我所有的程序之前都运行过,我用另外几个(只返回 0; 或 printf(etc...) )对其进行了测试,它们可以工作!

有什么想法吗? 谢谢

【问题讨论】:

    标签: c debugging error-handling visual-studio-debugging


    【解决方案1】:
    int* n;
    

    声明一个指向int 的指针。它没有分配地址,因此指向内存中的任意地址。这个地址几乎肯定是不可写的。即使它是可写的,它也不是你的记忆,所以你不知道写它会有什么效果。

    *n = 20;
    

    尝试写入这个不可预测的地址。这会导致未定义的行为。崩溃是一种有效(且有用)的未定义行为。

    要使您的程序正常运行,您需要为n 分配存储空间。您可以在堆栈上执行此操作

    int n;
    n = 20;
    printf("%i\n", n);
    

    或在堆上动态

    int* n = malloc(sizeof(*n));
    if (n == NULL) {
        printf("Error: out of memory\n");
        return -1;
    }
    *n = 20;
    printf("%i\n", *n);
    free(n);
    

    请注意,如果您为构建启用警告,您的编译器会警告您使用未初始化的变量。将 -Wall 添加到 gcc 的命令行或添加到 MSVC 的 /W4 以启用此功能。

    【讨论】:

    • 感谢您详细解释的答案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-11
    • 1970-01-01
    • 2014-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    相关资源
    最近更新 更多