初始化C ++未初始化的局部变量 [英] Beginner C++ uninitialized local variable

查看:241
本文介绍了初始化C ++未初始化的局部变量的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个函数:

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);

我得到一个错误:uninitialized local variable:在我的头像它:我声明主要,次要,构建,他们得到填充的功能。在调用代码的前三行期间已经为它们分配了空间。

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆