在C中,根据我的理解,像int和float这样的原语在首次声明时被初始化为0。如果声明包含基元的结构,则同样如此。我很难找到一种简单的方法来检查原语是否未初始化。
例如,假设我有一个在头文件中声明的int类型的实例变量。我需要在我的实现代码中使用这个变量,对我来说知道这个值是否已被初始化是很重要的。检查零不是一个真正的选项,因为如果该值确实应该为零,那么我已经重新初始化了一个已经更改的值。检查NULL也不起作用,因为它不是指针。
我提出的唯一解决方案是将第一段可执行代码中的变量初始化为某些值,我知道这些值永远不会与程序的其余部分相关。例如,如果值永远不应低于零,那么我将其初始化为-1以知道它尚未初始化。这看起来真的很苛刻,如果可以赋值变量的值范围发生变化,可能会导致问题。
对这类问题有什么有趣的建议吗?提前谢谢!
答案 0 :(得分:7)
您的理解不正确。无论是int
还是float
,本地变量都是未初始化的。
仅将static
个变量初始化为零。您应该在使用前初始化所有内容。即使您认为您的实现初始化变量,您也不应该依赖它。该标准不保证任何事情。使用未初始化的变量是一种未定义的行为。
答案 1 :(得分:2)
只有全局原语,指针和数据结构初始化为零;局部变量或malloc()
'内存不是。
答案 2 :(得分:0)
具有静态存储持续时间的对象初始化为零的零与代码明确设置的零之间没有区别。零只是零。
您所能做的只是使用非零无效数字(在定义它的.c
文件中)显式初始化它:
foo.h中:
extern double foo;
foo.c的:
double foo = NAN;
或者,或者,它附带一个标志变量,指示它是否已被初始化:
foo.h中:
extern double foo;
extern int foo_initialised;
foo.c的:
double foo;
int foo_initialised;