C语言中空/未完全填充数组的元素值是否为'\0'?附阿姆斯特朗数代码疑问
问题解答
关于未完全填充/未初始化数组的元素值问题
- C语言中,在函数内部定义的、未显式初始化的自动存储类型(auto)数组,元素值是未定义的垃圾值,不会被默认赋值为
'\0'或者0。- 你观察到在线编译器测试时结论成立,是因为部分在线编译环境为了方便调试,默认会对栈内存做清零初始化,刚好让你未填充的数组元素值为0,这属于特殊情况,不是C语言的标准规定。
- GCC默认编译时不会对自动类型的栈内存做初始化操作,未填充的数组元素都是栈上遗留的随机值,所以你的判断逻辑会失效。
- 如果你想让数组默认初始化为0,可以在定义时显式写
int sto[20] = {0};,此时所有未显式赋值的元素都会被初始化为0,你用sto[i] != '\0'的判断逻辑才能正常工作。
你当前代码的核心问题
- 没有给int数组显式设置结束标记,也没有利用第一个循环已经得到的有效元素个数做循环边界:你第一个拆分数字的while循环结束后,变量
i已经存储了你拆分出来的数字的总个数,第二个求和循环直接循环i次即可,不需要判断终止标记。 - 不要用
pow函数计算整数的三次方:pow是浮点数运算函数,存在精度误差,整数三次方直接写sto[i] * sto[i] * sto[i]更稳妥。
修正后的核心逻辑参考
// 第一个拆分数字的循环保持不变 while(num != 0) { sto[i] = num%10; num = num / 10; i++; } // 第二个循环直接用拆分得到的元素个数做上限 int len = i; i = 0; cub = 0; while(i < len) { int n = sto[i]; cub += n * n * n; i++; }
内容的提问来源于stack exchange,提问作者A typical nerd
相关产品推荐
相关产品推荐

