Valgrind比较指针与NULL

时间:2018-06-26 12:12:34

标签: c valgrind

我正在使用Valgrind调试代码,并且在将structNULL进行比较测试是否初始化void main() { int *unassignedPointer; if(unassignedPointer == NULL) printf("This Pointer is NULL\n"); } 时收到警告。

NULL

此代码可以编译并运行,但是在通过Valgrind运行时会发出警告:条件跳转或移动取决于未初始化的值。将其与tkinter进行比较的全部目的是确定它是否已初始化。这是危险的做法,还是我应该忽略这些警告?

4 个答案:

答案 0 :(得分:5)

您当然不应该忽略警告,应该通过初始化指针来解决它:

int *pointer = NULL;

通常,您无法检测是否已将变量分配给该变量,没有神奇的“无值”值,该变量的所有位都用于包含实际值。

答案 1 :(得分:3)

unassignedPointer是一个统一的局部变量,读取该变量将导致不确定的行为,即您将永远不会知道会发生什么。在大多数体系结构上,这些变量将仅包含内存垃圾,并且您的代码将不打印任何内容,或者根据您的运气而不会显示“此指针为NULL”。您应该正确初始化变量:

void main()
{
  int *unassignedPointer = NULL;
  if(unassignedPointer == NULL)
  printf("This Pointer is NULL\n");
}

答案 2 :(得分:2)

首先在这里

int *unassignedPointer; /*here it can points to any unknown memory location */ 

unassignedPointer未初始化并且未指向有效的内存位置并取消引用(如果尝试过),则会导致未定义的行为。您的编译器可能会警告您

  

“ unassignedPointer”在此函数中未初始化   [-Werror =未初始化]

如果您使用适当的警告标记(例如-Wall等来编译代码,那么请先使用unassignedPointer初始化NULL

int *unassignedPointer = NULL;

这是一种危险的做法,还是我应该忽略这些警告?永远不要忽略编译器警告。使用

更好地编译任何简单代码
gcc -Wall -Wstrict-prototypes -Werror test.c   /* Werror, stops the compilation, convert warning into error */ 

还请阅读C语言标准,草稿 n1256 部分 5.1.2.2.1

  

程序启动:应使用返回类型int且不带参数的方式进行定义:

int main(void) { /*
...
*/ }
     

或具有tw个运算符(此处称为argc和argv,尽管   可以使用yn ames,因为该功能对于   重新声明):

int main(int argc, char *argv[]) { /*
...
*/ }

void main() { 
   /*some code */
}

不正确,请使用

int main(void) {
    /*some code */
}

答案 3 :(得分:1)

当变量未初始化时,这意味着未明确为其赋予初始值。这意味着它可以具有任何值,包括NULL或其他一些值。

通常,没有静态存储持续时间的未初始化变量(即未标记为static的局部变量)具有不确定值。

此外,作为一般规则,C中的警告切勿。该语言假定您知道自己在做什么,并且没有其他语言可以提供的任何保护措施。