Skip to content

1.11 程序运行环境与调试

计算机程序设计 · C语言 · 1.11 程序运行环境与调试

程序运行环境与调试

🎯 一句话秒杀:2026年考纲新增考点——了解VS等IDE的基本调试功能,会断点调试、会看错误类型。


一、C程序的运行环境

常见C语言开发环境

IDE/编辑器特点适用场景
Visual Studio功能最全,有专业调试器Windows开发/考试
Dev-C++轻量级,适合初学者教学
Code::Blocks开源免费,跨平台教学
CLionJetBrains出品,功能强大专业开发
VS Code + MinGW轻量可定制主流选择

运行C程序的基本步骤

编辑(写代码) → 编译(Check语法) → 链接(Link库文件) → 运行(执行exe)
mermaid
flowchart LR
    A["编辑<br/>生成 .c 源文件"] --> B["编译<br/>生成 .obj 目标文件<br/>可能报编译错误(语法)"]
    B --> C["链接<br/>生成 .exe 可执行文件<br/>可能报链接错误(找不到函数)"]
    C --> D["运行<br/>执行 .exe<br/>可能报运行时错误(逻辑/崩溃)"]

    style A fill:#2F6B9E,color:#fff
    style B fill:#E67E22,color:#fff
    style C fill:#27AE60,color:#fff
    style D fill:#C0392B,color:#fff

📌 2026 新增考点记忆:编译查语法、链接找函数、运行看逻辑——三种错误要能区分。

步骤生成文件可能出现的错误
编辑.c 源文件语法错误、拼写错误
编译.obj 目标文件编译错误(语法问题)
链接.exe 可执行文件链接错误(找不到函数定义)
运行运行时错误(逻辑错误/崩溃)

二、常见错误类型

1. 编译错误(Compile Error)

编译时发现,代码无法通过编译 —— 必须修复!

c
// ❌ 语法错误
int a =    // 少了分号
printf("%d", a)

// ❌ 类型不匹配
int a = "hello";

// ❌ 未定义的标识符
printf("%d", undefined_var);

编译通过了,但链接时找不到函数实现

c
// ❌ 链接错误示例
int main() {
    func();  // 声明了但没定义
    return 0;
}

// ❌ 常见的"无法解析的外部符号"
// 通常是写了函数声明但忘记写函数体

3. 运行时错误(Runtime Error)

编译链接都过了,运行才出问题

c
// ❌ 数组越界
int a[5];
a[10] = 100;  // 编译能过,但运行可能崩溃

// ❌ 空指针访问
int *p = NULL;
*p = 10;      // 编译通过,运行崩溃

// ❌ 除零错误
int a = 10 / 0;  // 编译警告,运行崩溃

// ❌ 死循环
while (1) { }  // 程序卡住

4. 逻辑错误(Logic Error)— 最难找!

c
// ❌ 本意是判断相等,但写成赋值
if (a = 5) {   // 永远为真(a被赋值为5)
    printf("等于5");
}

// ❌ 忘了加break
switch(n) {
    case 1: printf("一");
    case 2: printf("二");  // 明明只想要case 1
}

三、Visual Studio 调试技巧

断点调试

操作方法快捷键
设置断点点击代码行号左侧F9
开始调试点击"本地Windows调试器"F5
逐语句执行单步执行F11
逐过程执行单步执行(不进入函数)F10
跳出函数Shift+F11
继续执行直到下一个断点F5
停止调试Shift+F5

调试窗口

窗口作用
监视查看/修改变量的值
自动窗口自动显示当前行相关的变量
局部变量显示当前函数的所有局部变量
调用堆栈查看函数调用的层级关系
内存查看内存中的原始数据

监视变量的方法

c
int arr[5] = {10, 20, 30, 40, 50};
int *p = arr;

在"监视"窗口中可以输入:

  • arr — 查看数组
  • arr[2] — 查看第3个元素
  • p — 查看指针指向的内容
  • (int*)0x1234 — 查看指定地址的内容

四、常见致命错误归类

错误现象可能原因解决方法
编译报错"语法错误"少分号/花括号不匹配检查对应行
"未声明的标识符"变量没定义 / 头文件没include检查声明
"无法解析的外部符号"函数声明了没定义检查函数体
运行时崩溃数组越界 / 空指针检查下标和指针
死循环循环变量没更新检查循环条件
结果不对逻辑错误F10单步跟踪

🚨 红牌警告

VS中使用scanf会报错 C4996? 解决方法:在文件最开头加 #define _CRT_SECURE_NO_WARNINGS 或者项目属性 → C/C++ → 预处理器 → 加 _CRT_SECURE_NO_WARNINGS

五、代码调试练习

找错实战

c
// 题目:找出下面代码中的错误
#include <stdio.h>

int main()
{
    int a[5] = {1, 2, 3, 4, 5};
    int i, sum;

    for (i = 0; i <= 5; i++)    // 错误1:i<=5越界
        sum += a[i];             // 错误2:sum没初始化

    printf("sum = %d\n", sum);

    int *p = NULL;
    *p = 10;                     // 错误3:空指针赋值

    return 0;
}

错误分析:

  1. i <= 5a[5] 下标越界(最大 a[4])
  2. sum 没初始化为0,会累加垃圾值
  3. *p = 10 → p是NULL,访问非法内存

📝 闭卷真题挑战

(点击下方空白查看答案)

1. VS中设置断点的快捷键是?

2. F10(逐过程)和F11(逐语句)的区别?

3. 编译错误、链接错误、运行错误的区别?

4. 写好代码后为什么还要编译才能执行?

5. 写出运行结果(含错误分析):
   int a=0; if(a=0) printf("真"); else printf("假");
👆 点击展开答案
  1. F9
  2. F10逐过程:不进入函数内部;F11逐语句:进入函数内部
  3. 编译错误:语法不对,编译不通过;链接错误:找不到函数定义;运行错误:编译通过,运行时崩溃或结果不对
  4. 计算机只能执行机器指令,C语言是高级语言,需要编译器翻译成机器码
  5. "假"——if(a=0) 是赋值语句,a=0为假,走else分支。但本意可能是 if(a==0)

📖 教材习题对照

教材内容知识点难度
VS调试介绍断点设置与单步执行⭐⭐
常见错误编译/链接/运行错误⭐⭐
调试实例监视变量与内存⭐⭐⭐

对应教材:谭浩强《C程序设计》第5版 → 各章节调试相关 对应考试大纲:考点11 — C程序运行环境与代码调试(2026新增)

📺 配套视频

复习到本考点 → 先看视频补讲,再刷上面「闭卷挑战」。

仅供个人学习 · 考生回忆版 · 非考试院原卷