C Valgrind将指针与NULL进行比较
我正在使用Valgrind调试我的代码,当我通过将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进行比较的关键是确定它是否
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,最后一个短语看起来没有必要。不清楚“变量的所有位都用于包含实际值”,因为我不认为指针被指定为不包含填充。艾克,那是洛杉矶