C ++未初始化的局部变量 [英] C++ uninitialized local variable
问题描述
我有一个函数:
VOID GetOSVersion(PDWORD major, PDWORD minor, PDWORD build)
{
OSVERSIONINFO osver;
ZeroMemory(&osver, sizeof(OSVERSIONINFO));
osver.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&osver);
if(major)
*major = osver.dwMajorVersion;
if(minor)
*minor = osver.dwMinorVersion;
if(build)
*build = osver.dwBuildNumber;
}
我想这样调用它:
PDWORD major;
PDWORD minor;
PDWORD build;
GetOSVersion(major, minor, build);
我得到一个错误:未初始化的局部变量:对于所有三个参数。在我的脑海中,它就像:我声明了major,minor,build,它们被填充到函数中。在调用代码的前三行中已经为它们分配了空间。
I get an error: uninitialized local variable: for all the three arguments. In my head it went like: I declare major, minor, build, and they get filled in the function. Space is already allocated for them during the first three lines of the invoking code.
我肯定在这里丢失了一些东西。有人可以帮我解释一下吗?
I am surely missing something here. Could somebody please explain this for me?
推荐答案
存在问题:
DWORD major;
DWORD minor;
DWORD build;
GetOSVersion(&major, &minor, &build);
修复:
VOID GetOSVersion(PDWORD major, PDWORD minor, PDWORD build)
{
OSVERSIONINFO osver = {};
osver.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&osver);
if(major)
*major = osver.dwMajorVersion;
if(minor)
*minor = osver.dwMinorVersion;
if(build)
*build = osver.dwBuildNumber;
}
DWORD major = 0;
DWORD minor = 0;
DWORD build = 0;
GetOSVersion(&major, &minor, &build);
PDWORD是DWORD的指针。这三个参数都是输出参数。在C / C ++中,这是一种常见用法:如果要从一个函数返回多个值,则需要将指针传递给变量(或者在c ++中也要引用):
PDWORD is pointer to DWORD. All three parameters are output parameters. In C/C++, it's a common usage: if you want to return more then one value from a function, you need pass pointer (or reference too in case of c++) to a variable:
int var = 0;
if(some_function_that_can_fail_and_write_result(&var))
;//do something
在您的情况下,您要按值将未初始化的指针传递给函数。等同于:
In your case you are passing uninitialized pointer to a function by value. It's the same as:
void foo(int parameter);
// ...
int a;
foo(a);
您有很多方法:
通过引用传递未初始化的指针:
Pass uninitialized pointer by reference:
VOID GetOSVersion(PDWORD& major, PDWORD&, PDWORD&)
{
//...
major = new DWORD(osver.dwMajorVersion);
}
// usage:
PDWORD major;
GetOSVersion(major, ....);
//...
delete major;
通过引用传递所有参数:
Pass all parameters by reference:
VOID GetOSVersion(DWORD& major, DWORD&, DWORD&)
{
//...
major = osver.dwMajorVersion;
}
// usage:
DWORD major = 0;
GetOSVersion(major, ....);
使用您的GetOSVersion()版本,但是此答案的开头是解决方法
Use your version of GetOSVersion(), but with the fix in this answer on the beginning
这篇关于C ++未初始化的局部变量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!