C Valgrind将指针与NULL进行比较

C Valgrind将指针与NULL进行比较,c,valgrind,C,Valgrind,我正在使用Valgrind调试我的代码,当我通过将struct与NULL进行比较来测试它是否初始化时,我收到了一条警告 void main() { int *unassignedPointer; if(unassignedPointer == NULL) printf("This Pointer is NULL\n"); } 此代码编译并运行,但在通过Valgrind运行时,它会发出警告:条件跳转或移动取决于未初始化的值。将它与NULL进行比较的关键是确定它是否

我正在使用Valgrind调试我的代码,当我通过将
struct
NULL
进行比较来测试它是否初始化时,我收到了一条警告

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

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

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

int *pointer = NULL;

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

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

int *pointer = NULL;

一般来说,您无法检测是否已分配变量,没有神奇的“无值”值,变量的所有位都用于包含实际值。

未分配指针是一个统一的局部变量,读取此类变量将导致未定义的行为,即您永远不知道会发生什么。在大多数架构中,这些变量只包含内存垃圾,代码将不打印任何内容或“此指针为空”,这取决于您的运气。您应该正确初始化变量:

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

unassignedPointer是一个统一的局部变量,读取此类变量将导致未定义的行为,即,您永远不会知道会发生什么。在大多数架构中,这些变量只包含内存垃圾,代码将不打印任何内容或“此指针为空”,这取决于您的运气。您应该正确初始化变量:

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

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

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

“unassignedPointer”在未初始化的情况下在此函数中使用 [-Werror=未初始化]


如果您使用适当的警告标志(如
-Wall
等)编译代码,请首先使用
NULL
等初始化
unassignedPointer

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 op参数(此处称为argc和argv,尽管 可以使用yn ames,因为它是 (再次声明):

这个

不正确,请改用

int main(void) {
    /*some code */
}
首先在这里

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

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

“unassignedPointer”在未初始化的情况下在此函数中使用 [-Werror=未初始化]


如果您使用适当的警告标志(如
-Wall
等)编译代码,请首先使用
NULL
等初始化
unassignedPointer

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 op参数(此处称为argc和argv,尽管 可以使用yn ames,因为它是 (再次声明):

这个

不正确,请改用

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

当一个变量未初始化时,这意味着它没有显式地给出初始值。这意味着它可以有任何值,包括NULL或其他值

形式上,没有静态存储持续时间的未初始化变量(即未标记为
static
)具有不确定值


另外,作为一般规则,永远不要忽略C中的警告。该语言假定您知道自己在做什么,并且没有其他语言所具有的任何保护措施。

当变量未初始化时,这意味着它没有显式地给出初始值。这意味着它可以有任何值,包括NULL或其他值

形式上,没有静态存储持续时间的未初始化变量(即未标记为
static
)具有不确定值


另外,作为一般规则,永远不要忽略C中的警告。该语言假定您知道自己在做什么,并且没有其他语言所具有的任何保护措施。

将它与NULL进行比较的全部目的是确定它是否已初始化。呵呵?!?!这完全没有道理。如果它没有初始化,将它与任何东西进行比较都是无用的。这是未定义的行为,因为指针本身没有地址。请参阅。将其与NULL进行比较的全部目的是确定它是否已初始化。呵呵?!?!这完全没有道理。如果它没有初始化,将它与任何东西进行比较都是无用的。这是未定义的行为,因为指针本身没有地址。请参阅。不清楚“变量的所有位都用于包含实际值”,因为我不认为指针被指定为不包含填充。IAC,最后一个短语看起来没有必要。不清楚“变量的所有位都用于包含实际值”,因为我不认为指针被指定为不包含填充。艾克,那是洛杉矶