为什么strncat函数会修改中缀转后缀代码中的for循环迭代器?
异常现象原因
- 根本原因是栈缓冲区溢出触发未定义行为:你定义的
char post[1] = "\0"仅分配了1字节的栈内存,仅能容纳字符串结束符\0,没有多余空间存储转换后的后缀表达式内容,后续所有strncat写入操作都会访问数组边界之外的非法内存。 - 函数栈上的局部变量是连续排布的,
post数组之后的内存地址恰好对应for循环迭代器i的存储位置:第一次循环写入字符A时已经越界写入了1字节,第三次循环写入字符B时,越界写入的字节直接覆盖了i的原始值,所以你会观察到i突然变成16898这类异常数值。 - 即使没有出现迭代器被修改的现象,这个长度为1的
post数组也完全无法承载你的输入对应的后缀表达式,非法内存访问会导致任意不可预期的结果,包括程序崩溃、输出乱码、逻辑错乱等。
简单修复方案
根据输入表达式的最大长度合理分配post数组的空间即可:输入长度为l时,后缀表达式最长不会超过l,直接定义char post[l+1] = "\0";(C99及以上标准支持变长数组),或者动态分配足够的堆内存都可以解决问题。
内容的提问来源于stack exchange,提问作者Fahad Charolia
相关产品推荐
相关产品推荐

