2014-02-27 91 views
4

我工作的一个项目crypter并试图编译程序时遇到了以下错误。错误C4703:可能未初始化本地指针变量“pNamesPtr”使用

main.cpp中(520):错误C4703:潜在的未初始化的局部指针 变量 'pNamesPtr' 用
==========生成:0成功,失败1,0先进-date,0已跳过==========

 DLLNAMES[i].UsedAlready = 0; 
    } 


    *dwOutSize = (DWORD)pNamesPtr - (DWORD)pBuffer;//*<----is line 520 of error 
    *dwImportsSize = *dwOutSize - *dwIATSize;  
    return pBuffer; 
} 
#pragma pack(1) 
typedef struct 

有人可以帮助我这个错误?你需要更多的代码才能有一个好的答案?

+1

有没有办法,我们可以告诉你,如果初始化与否。 – chris

+0

你如何声明'pNamesPtr'。添加相同的代码.. – HadeS

回答

2

这意味着

  • 你不初始化pNamesPtr在声明它,所以它有一个无效的值开始;和
  • 在使用它之前,编译器无法确定您将为其分配一个有效值。

检查从申报到使用点的所有代码路径。他们是否都指定了一些对变量有意义的东西?如果不是的话,修复它,让他们这样做。

如果他们这样做了,你确信你正确地分配给它,你可以简化代码,这样很明显的编译器,它是什么?

如果一切都失败了,那么你可以通过它来初始化或nullptr在初始化一些其他的默认值沉默的编译器。但只有在你确定你的代码是正确的时候才会这样做 - 编译器通常很擅长发现这样的错误。

5

这个警告并不总是一个错误,有时它只是优化的结果。由于它在你的代码中,你不知道这是什么,它实际上可能是一个错误。

例如,如果我写:

int i; 

if (this_and_that) 
    i = 5; 

if (whatever) 
    printf("%d\n", i); // <--- this may give a potential blahblah warning 

如果你正在优化,那么你可能知道的whatever的值始终为true时this_and_that值为true,所以如果printf被称为然后i已经保证被初始化,但编译器通常无法弄清this_and_thatwhatever之间的关系,这就是为什么你会得到警告。对此警告的一种可能的快速修复是将变量初始化为您声明它的默认值。在我看来,保留初始值是一个不好的做法,也是很多错误的来源。

+0

当我不小心时,这种情况发生在我身上 - 如果你有一个if-else if-else类型的设置,也就是这样,你知道一个变量/指针将被设置,因为你有一个'else',但由于它们全部只是有时被调用,所以编译器可能会抱怨 – chrisb2244

+1

@ chrisb2244是的,如果我们想概括我的语句:如果你尝试使用在变量初始化和变量使用之间的所有可能的代码执行路径上未初始化的变量。因此,任何用“jump/goto”生成代码的控制流语句都可能导致这种情况,例如'switch'可以做同样的事情,但是更具有异国情调的控制流程示例:从循环中断开可能会导致这种情况,如果初始化的变量是在你的break语句之后的循环里面... – pasztorpisti

+0

纠正我以前的评论:变量*声明*和变量用法之间 – pasztorpisti

-1

把这个在你的代码:

xtype *pNamesPtr = NULL 
+2

我认为这个答案可以改进,不清楚它应该放在哪里,而你不是用适当的格式突出显示代码。 – phaberest