You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

以下C语言程序会产生哪类错误?各类型程序错误的核心区别是什么

示例代码运行结论
#include <stdio.h>

int *fun() 
{ 
    int j = 18; 
    return &j; 
} 

int main() 
{ 
    int *p = fun(); 
    printf("%d\n", *p);
}

这段代码不会产生编译时错误:仅在开启高等级编译警告(如gcc的-Wall参数)时会触发「函数返回局部变量地址」的警告,只要没有开启「将警告视为错误」的编译选项,就能正常生成可执行文件。
运行时会触发未定义行为,绝大多数场景下属于运行时错误:典型表现为输出乱码、程序崩溃(段错误),仅在栈内存未被后续操作覆写的极端巧合场景下会输出18,该结果完全不可复现、不可靠。
错误根因:局部变量j存储在函数栈帧中,fun执行结束后对应栈帧会被系统回收,返回的指针为野指针,后续对该指针的解引用操作访问的是已经被释放的非法内存。

常见程序错误核心区别
  • 编译时错误(Compile Time Error):编译阶段被编译器检测到的错误,存在该类错误时无法生成可执行文件,包含语法错误、静态语义错误两类。
  • 语法错误(Syntax Error):编译时错误的子类,代码违反编程语言的语法规则导致,比如C语言中遗漏分号、括号不匹配、关键字拼写错误等,编译器可直接定位报错位置。
  • 语义错误(Semantic Error):分为两类:
    • 静态语义错误:属于编译时错误子类,语法无问题但不符合语言静态规则,比如变量未声明就使用、给const常量赋值、函数返回值类型和声明不匹配,编译阶段可被检测。
    • 动态语义错误:属于运行时错误子类,运行阶段才会暴露的语义违规,比如数组越界、空指针解引用、除零操作,编译阶段无法完全排查。
  • 运行时错误(Runtime Error):编译通过生成可执行文件后,运行阶段触发的错误,会导致程序异常退出、输出异常,常见类型有内存访问错误(段错误)、栈溢出、目标文件不存在导致的IO错误等。
  • 逻辑错误(Logical Error):不会触发任何编译或运行报错,程序可以正常执行结束,但输出结果不符合预期,由代码逻辑实现错误导致,比如排序算法大小比较条件写反、循环边界计算错误、业务计算公式写错等,只能通过调试、测试用例排查。

内容的提问来源于stack exchange,提问作者SuspectBloom993

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 10:45:03