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

未初始化C数组为何出现异常默认值?KR《C程序设计语言》相关问题

关于K&R《C程序设计语言》1.6章示例中未初始化数组的奇怪现象

嘿,我当年啃这本C语言圣经的时候,也栽过一模一样的跟头!咱们来拆解下你遇到的问题:

  • 核心原因:局部数组未初始化的行为是未定义的
    你声明的int ndigit[10]如果是在函数内部(局部变量),它会被分配在栈内存上。栈内存不会自动清零,而是保留之前程序运行留下的垃圾值——你看到前8个元素是0纯粹是巧合,刚好那段内存之前被清过或未被使用,而最后两个位置的内存刚好残留了之前的随机数据(也就是你看到的-373429304和32766)。

  • 为什么K&R的示例里要有置零循环?
    那个示例里的for循环可不是多余的!它的作用就是手动把数组所有元素置零,避免垃圾值干扰统计结果。漏掉这一步的话,程序行为完全不可预测——这次是前8个碰巧为0,下次说不定整个数组都是乱码。

  • 更简洁的解决办法
    除了用循环逐个置零,C语言还有更省心的初始化方式:

    int ndigit[10] = {0};
    

    这样写的话,编译器会自动把数组中未显式赋值的元素都设为0,不用再手动写循环。

补充一句:如果是全局数组的话情况就不同了——全局变量会被分配在静态内存区,默认会被初始化为0,但局部数组可没这待遇哦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:05:30