c-如何在运行时检查指针变量是否为垃圾



我使用valgrind来验证我的代码,它在我的一个函数中报告"条件跳转或移动取决于未初始化的值",该函数以指针数组为参数。

现在,如何在运行时检查数组是否包含垃圾值(可能使用了条件断点)?比方说,我不访问指针,因此程序不会中断。

识别垃圾指针需要检查的条件是什么?

虽然其他答案都是正确的,但您也可以使用valgrind来帮助您确定数组中的一个或多个条目到底是导致问题的原因。

您需要做的是将代码添加到在数组上循环的程序中(当然,您可能已经有了这样的循环),然后包括valgrind/memcheck.h并将类似的内容添加到循环中:

if (VALGRIND_CHECK_VALUE_IS_DEFINED(entry)) {
  printf("index %d undefinedn", index);
}

其中entry是来自数组的实际值,index是该值在arry中的索引。

您无法区分有效指针和垃圾(未初始化)指针,它们都只是数字。

事实上,您在代码中的某个点上处理一个"垃圾"指针,这表明在达到该点之前存在问题。

您不测试垃圾,而是在创建数组和第一次考虑使用这些值之间的某个时间点将非垃圾值放入数组中。通常在创建阵列时执行此操作:

const char* strings[] = {0, "junk", "here"};
int some_values[10] = { 0 };

Valgrind使用自己的技巧来识别它认为是垃圾的东西,但这些技巧超出了标准的范围,普通的C代码不能使用它们(或者无论如何都不应该尝试)。即使你能以某种方式理解valgrind的功能,你最终也会得到不适用于所有实现的代码,或者只有在valgrind下运行时才有效的代码。

您需要系统地将所有指针初始化为NULL。当您释放内存时,也会将指针重置为NULL。这可以使用"构造函数/析构函数"来完成,例如包装malloc/free。只有这样,您才能测试NULL值指针,看看是否出了问题。

最新更新