C语言long类型默认值问题:未初始化long变量为何值为1而非0
问题根因
你对C语言变量默认初始值的认知存在错误,C语言不会为非静态局部变量做默认初始化:
- 只有全局变量、被
static修饰的静态局部变量,才会在程序加载时被默认初始化为0 - 你代码中定义在
main函数内的xno、zno都属于自动存储类(auto)的局部变量,分配在程序栈空间,创建时不会主动擦除或初始化对应内存区域,取值就是栈内存之前遗留的脏数据,你本次运行得到zno=1、xno=0完全是当前运行环境下的随机结果,换编译参数、换操作系统甚至同环境多次运行都可能得到不同值。
额外的代码问题
你的代码还存在格式化字符不匹配的未定义行为:printf输出long类型变量应该用%ld占位符,你用了适配int类型的%d,类型不匹配的情况下输出结果本身也不可靠。
修正方案
如果需要局部变量初始值为0,主动手动初始化即可,示例如下:
#include <stdio.h> long add(long, long); int main() { long xno = 0; long zno = 0; long sum; printf("xno = %ld, zno = %ld \n", xno, zno); sum = add(xno, zno); printf("sum = %ld", sum); return 0; } long add(long x, long y) { printf("x = %ld, y = %ld \n", x, y); return x + y; }
内容的提问来源于stack exchange,提问作者KedarNarayana
相关产品推荐
相关产品推荐

