无论如何要知道变量是否已在C中初始化?

时间:2016-03-18 01:43:17

标签: c

我目前正在开发一个程序,它接收输入(通过main)并根据输入绘制不同的分形。 我在结构中保存已解析和转换(转换为数字)的用户输入:

typedef struct
{
        unsigned int xcord,ycord;
}point_t;

typedef struct
{
        int fractalType;
        double lstart,lend,lconstant;
        double leftangle,rightangle;
        point_t drawStart;

}input_data_t;

我遇到的问题是,某些分形不会使用结构中包含的所有变量,如果使用变量调用某个分形,它不会使用我必须显示错误。

无论如何现在对这个问题,我知道变量当DECLARED"拿起"来自指定记忆位置的手中的垃圾。有没有办法知道变量是否在运行时被初始化,以确保解析后没有使用过不必要的变量? (如果需要,我需要跨平台解决方案)

3 个答案:

答案 0 :(得分:2)

不,没有办法直接找到它。从未初始化的变量读取会调用未定义的行为,并且无法从中恢复。但是,您可以选择一些方法来防止这种情况发生。

如果您的变量具有有意义的默认值,只需将它们初始化为这些默认值,然后再对它们执行任何其他操作。您仍然无法区分默认变量和恰好具有相同值的变量之间的区别,但如果您的逻辑在没有这些知识的情况下工作,则完全没问题。 (例如,如果您要绘制正弦函数 f x )= a + b sin( c x + d ),默认 a d 是很自然的到0和 b c 到1。)

如果参数未跨越数据类型的整个值范围,则可以将它们初始化为某个标记值,并在使用前检查它们。例如,您可以将NAN用于浮点值,或者对于任何不能为负的类型的数量使用-1。许多人不喜欢这种解决方案,因为很容易忘记检查值并使用哨兵就好像它是一个合适的值,从而计算垃圾。我相信每种技术都有时间和地点,但这可能确实被过度使用了。

如果其他所有内容都失败了,您可以为每个变量添加一个标志,指示它是否有值。为了使其可用,我建议您创建一个具有合理名称的数据类型,例如这个。

struct optional_float
{
  bool initialized;   // always safe to read, set appropriately
  float value;        // only safe to read if initialized == true
};

在C ++中,使用新的std::experimental::optional<T>可以做得更好。但我意识到你的问题已经删除了C ++标签。

最后,请务必通过Valgrind之类的调试器运行代码,或使用sanitizer检测未初始化变量的意外读取。

答案 1 :(得分:0)

我认为没有办法检查变量是否为initialiez。 由于c中的默认变量在初始化之前具有随机值或0。

如果您想知道变量是否已初始化,则可以为此变量设置合法值范围。在使用它之前,您可以检查该值是否在范围内。

使用变量进行安全保护的最佳方法是自行检查是否要使用变量。

答案 2 :(得分:0)

为什么不只是使用一些无效值初始化该结构,然后问题就变成该值是否无效。