我有一个功能:

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,它们被填充到函数中。在调用代码的前三行中已经为它们分配了空间。

我肯定在这里错过了一些东西。有人可以帮我解释一下吗?

最佳答案

问题在那里:

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 ++中也要引用):

int var = 0;
if(some_function_that_can_fail_and_write_result(&var))
 ;//do something


在您的情况下,您要按值将未初始化的指针传递给函数。等同于:

void foo(int parameter);
// ...
int a;
foo(a);


您有很多方法:

通过引用传递未初始化的指针:

VOID GetOSVersion(PDWORD& major, PDWORD&, PDWORD&)
{
//...
major = new DWORD(osver.dwMajorVersion);

}
// usage:
PDWORD major;
GetOSVersion(major, ....);

//...
delete major;


通过引用传递所有参数:

VOID GetOSVersion(DWORD& major, DWORD&, DWORD&)
{
//...
major = osver.dwMajorVersion;

}
// usage:
DWORD major = 0;
GetOSVersion(major, ....);


使用您的GetOSVersion()版本,但请首先使用此答案中的修复程序

关于c++ - C++未初始化的局部变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24472174/

10-12 20:40