程序运行时会出现 xxxx.exe 中的 0x00fa1c29 处有未经处理的异常: 0xC00000FD: Stack overflow

本文主要介绍了当遇到栈溢出异常时的两种解决方案:一是通过动态分配的方式在堆上为局部变量分配内存;二是调整项目的堆栈保留大小设置。

很明显,该异常表示栈溢出,也就是局部变量太大了,超过了编译器的设定的值。

方法一:

局部变量通过动态分配,分配堆内存,即,new或者malloc来分配堆上面的内存

方法二:

将“项目属性、链接器、系统、堆栈保留大小”设大一点比如16000000再试试

### Keil C 编译器中 error C29、C33 与 C251 错误的成因与解决方案 在使用 Keil C 编译器进行嵌入式开发时,开发者可能会遇到多个编译错误,其中 `error C29`、`error C33` 和 `error C251` 是较为常见的问题。这些错误通常涉及语法或存储类声明不当,也可能源于预处理阶段的异常。 #### error C29: 形参具有非法存储类 此错误表示函数的形式参数列表中使用了不允许的存储类说明符(如 `auto`、`static`、`extern` 等)。标准C语言规定,函数参数只能使用默认的自动变量(`auto`)或 `register` 存储类[^1]。例如: ```c void func(auto int x); // 错误:auto 不允许用于函数参数 ``` 正确的写法是省略存储类说明符: ```c void func(int x); // 正确 ``` 若确实需要优化寄存器使用,可使用如下方式: ```c void func(register int x); // 合理使用 register ``` 但需注意,即使使用 `register`,也不能对其取地址,并且是否真正放入寄存器仍由编译器决定。 #### error C33: 函数参数名无效 该错误通常伴随 `error C29` 出现,表示在函数参数声明中使用了非法标识符或重复定义了存储类。例如: ```c void example(static int black_num); // 错误:static 不允许出现在参数列表中 ``` 应修改为: ```c void example(int black_num); // 正确 ``` #### error C251: FATAL-ERROR INPUT FILE STACK OVERFLOW 该错误属于严重预处理错误,表明预处理器在解析源文件时发生了栈溢出,通常由于宏定义嵌套过深或递归宏调用引起。例如: ```c #define A B #define B A A // 展开时导致无限循环和栈溢出 ``` 解决方法包括: - 避免宏定义之间的循环引用。 - 控制宏展开层级,避免过于复杂的嵌套。 - 检查头文件包含是否形成环状依赖。 - 使用 `#pragma max_include_depth` 设置最大包含深度限制。 此外,确保代码结构清晰、模块化良好,有助于减少此类错误的发生。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值