gpt4 book ai didi

C++ 未初始化的局部变量

转载 作者:太空宇宙 更新时间:2023-11-04 15:18:46 25 4
gpt4 key购买 nike

我有一个函数:

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

我肯定在这里遗漏了一些东西。有人可以为我解释一下吗?

最佳答案

当涉及到需要指针参数的函数时,您犯了很多人都会犯的错误。

当一个函数需要一个指针作为参数时,这并不意味着你盲目地声明一个指针并将它传递给函数。该函数要求的是一个现有的有效实体的 address-of

DWORD major, minor, build;
GetOSVersion(&major, &minor, &build);

上面的DWORD是有效的,所有要做的就是将这些变量的地址传递给函数。

与此相关的另一个错误(不是错误,因为它会给出预期的结果,但仍然是一个“错误”)是声明一个指针,让它指向某个有效的地方,然后将它传递给功能。换句话说:

PDWORD major, minor, build;
major = new DWORD;
minor = new DWORD;
build = new DWORD;
GetOSVersion(major, minor, build);
delete major;
delete minor;
delete build;

PDWORD pmajor, pminor, pbuild;
DWORD major, minor, build;
pmajor = &major;
pminor = &pminor;
pbuild = &build;
GetOSVersion(pmajor, pminor, pbuild);

我见过以这种方式编写的代码。这表明程序员没有清楚地理解函数需要指针作为参数时的含义。程序员错误地认为必须声明一个指针,让它指向某个有效的地方,然后传递这个指针。

是的,您在没有崩溃的情况下得到了结果,但是调用分配器(新建/删除)是浪费时间,或者如果不调用分配器,则会创建不必要的指针变量,这会不必要地混淆代码。

所以最简单的方法就是上面的第一个例子。只需声明非指针类型,并传递地址即可。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com