C语言printf缺参数时输出大负整数和后续0的原因是什么?
问题1:printf缺参数时输出的首个随机正负整数来源是什么?
printf是C标准库中的可变参数函数,它本身无法感知调用方实际传入了多少个参数,只会严格按照格式串的占位符声明,从约定的参数传递位置(对应架构的通用寄存器、或者栈的指定偏移位置)读取数据。你没有传入对应参数时,printf读取的就是程序运行前,操作系统加载程序、C运行时初始化过程中在这些位置留下的脏数据,属于未定义行为范畴,数值本身无固定逻辑。
问题2:后续大量输出0的原因是什么?
这符合对应架构的ABI调用规则:printf作为被调用函数,执行过程中会使用用来传递可变参数的临时寄存器,执行完成后会将这些寄存器清零(符合被调用方寄存器清理规则)。第一次调用printf读完脏数据后,对应参数位置就被置为0,后续循环每次调用printf时都没有传入新参数,每次读取到的都是上一次调用后留下的0值,因此后续输出全为0。
问题3:随机数值正负变化的逻辑是什么?
C语言中signed int类型的最高二进制位是符号位,该位为0时数值为正,为1时数值为负。你读取到的脏数据是完全随机的二进制序列,最高位的值不确定,因此解析出来的int值正负随机。
问题4:为何会偶发链接错误且后续无法复现?
该链接错误和你的代码逻辑、使用int还是long类型完全无关,是在线IDE后端的偶发故障:提交代码时后端编译节点可能出现临时负载异常、源文件落盘失败的问题,链接阶段找不到包含main函数的目标文件,就抛出了undefined reference to main的报错。后续节点状态恢复,能正常接收、编译你的代码,因此错误无法复现,你修改循环变量为long的操作只是刚好和故障恢复的时间点重合,二者没有因果关系。
内容的提问来源于stack exchange,提问作者anthonyarmend
相关产品推荐
相关产品推荐

