我正在使用Valgrind调试代码,并且在将struct
与NULL
进行比较测试是否初始化void main()
{
int *unassignedPointer;
if(unassignedPointer == NULL)
printf("This Pointer is NULL\n");
}
时收到警告。
NULL
此代码可以编译并运行,但是在通过Valgrind运行时会发出警告:条件跳转或移动取决于未初始化的值。将其与tkinter
进行比较的全部目的是确定它是否已初始化。这是危险的做法,还是我应该忽略这些警告?
答案 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中的警告切勿。该语言假定您知道自己在做什么,并且没有其他语言可以提供的任何保护措施。