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

2023-11-27

我有一个功能:

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

我收到错误:未初始化的局部变量:对于所有三个参数。在我的脑海里,它是这样的:我声明主要、次要、构建,然后它们被填充到函数中。在调用代码的前三行中已经为它们分配了空间。

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


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

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

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

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

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

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

or

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

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

是的,您可以获得结果而不会崩溃,但是调用分配器(新建/删除)是浪费时间,或者如果不调用分配器,则会创建不必要的指针变量,这会不必要地混淆代码。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 未初始化的局部变量 的相关文章

随机推荐

  • 如何确认异步 EF6 wait db.SaveChangesAsync() 是否按预期工作?

    我的代码如下所示 public async Task
  • C 文件操作:检查打开的文件指针访问模式

    一个简单的问题 如何检查已打开的文件指针的访问模式 假设一个函数传递了一个已经打开的 FILE 指针 Pseudo code bool PseudoFunction FILE Ptr if Insert check for read onl
  • asp.net 身份获取登录用户的所有角色

    我创建了一个基于角色的菜单 并遵循该菜单this教程 在该页面的某些位置您会看到这行代码 String roles Roles GetRolesForUser 它返回当前登录用户的所有角色 我想知道如何使用新的 ASP NET Identi
  • Swift 2 中的 HTTP POST 错误处理

    我是新来的 这是我的第一个问题 我尝试在 Swift 2 中编写一个发出 HTTP POST 请求的应用程序 但我不知道如何使用 Swift 2 的新错误处理 任何人都可以告诉我如何实现 尝试捕捉 Swift 2 对下面代码片段的错误处理
  • JavaScript 元素样式

    我很好奇为什么是这个 div class overlay fdsfsd div overlay width 100px height 200px background color red alert document getElements
  • Objective-c 中是否有等效的 sqlite .dump ?

    我正在尝试开发一个 iOS 应用程序 该应用程序允许用户使用 GameKit 通过蓝牙同步他们的 sqlite 数据库 有没有办法使用许多 sqlite Objective C 库中的任何一个在 sqlite shell 上执行相当于 du
  • RVO 应何时启动?

    从下面的代码来看 如果发生了RVO 我希望看到2个地址指向同一位置 但事实并非如此 我的编译器是MS VC9 0 include
  • blob 在 ios 上不接受 Uint8Array

    我尝试创建一个 Blob 对象并将 Uint8Array 传递给它的构造函数 它在 Windows 上的 chrome 和 firefox 上运行良好 然而 在 ios 上的 chrome 和 safari 中 Blod 不包含 Uint8
  • 为什么Java默认只初始化类变量而不初始化局部变量?

    我正在学习 Java 中的链表 我有三个文件Main java List java and Node java 当我这样做时 我遇到了一个问题 为什么我应该初始化在方法中声明的局部变量 而不是在类中声明的类变量 In the first p
  • Visual Lisp:如何调用外部 C++ DLL 中的函数

    我有一个我编写的 C dll 本机的 不是 net 并且我想使用 Visual Lisp 中的功能 任何人都可以向我指出如何执行此操作的示例 或者至少要阅读哪些文档 我通过为我的 dll 编写一个 activex COM 包装器解决了这个问
  • 处理 AWS PHP SDK 2 中的错误

    如果我尝试从 S3 存储桶中获取不存在的对象 Amazon PHP SDK 2 会给我一个非常难看的错误 对我来说很方便 但对最终用户来说毫无意义 E g s3 aws gt get s3 result s3 gt getObject ar
  • JPA Glassfish 数据库更新问题

    我在 Glassfish v3 0 1 上部署了一个应用程序 它从数据库中的表中读取事件 一旦准备好 它会将它们标记为已处理 当尝试调用执行更新的方法时 我收到一个奇怪的错误 我无法解释 Override TransactionAttrib
  • AWS Glue 爬网程序创建分区和文件表

    我有一个非常基本的 s3 设置 我想使用 Athena 对其进行查询 数据全部存储在一个存储桶中 并组织到年 月 日 小时文件夹中 data 2018 01 01 01 file1 json file2 json 02 file3 json
  • 在 Bash 中递归更改文件扩展名

    我想递归地遍历一个目录并更改特定扩展名的所有文件的扩展名 例如 t1 to t2 执行此操作的 bash 命令是什么 Use find name t1 exec bash c mv 1 1 t1 t2 如果你有rename可用然后使用one
  • Python:pysqlite 库不支持 C 扩展加载

    我正在尝试让 Spatialite 与我的 django 应用程序一起使用 但是 我遇到了以下问题 raise ImproperlyConfigured The pysqlite library does not support C ext
  • 当服务器处于无限循环并且客户端停止时会发生什么?

    我试图弄清楚服务器和客户端之间的 交谈 是如何完成的 因此 当服务器生成无限循环时 echoing hello br 例如 当客户停止或点击 返回 时会发生什么 服务器如何知道循环已结束 或者它旁边是否有一个无限的进程 我可以在任何地方阅读
  • AngularJS 中的 ng-repeat 自动对焦

    我使用 ng repeat 获取多个电话号码 div div
  • 既然我们有了 ES6 Promise,还有理由使用 Q 或 BlueBird 这样的 Promise 库吗? [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 在 Node js 添加了对 Promise 的原生支持之后 还有理由使用 Q 或 BlueBird 等库吗 例如 如果您正在启动一个新项目 并且假设在该项目中您没有任何使用这些库的依赖项
  • 通过 HTTP 使用 MSMQ。如何解决队列问题?

    我目前正在尝试将 MSMQ 与 C 和 NET 结合使用以实现 IPC 我试图理解它是如何工作的 但我对它很困惑访问 MSMQ 队列时路径名称和格式名称之间的差异 我在以下帖子中发现了一些类似的问题 通过 HTTP 的 MSMQ 调用未到达
  • C++ 未初始化的局部变量

    我有一个功能 VOID GetOSVersion PDWORD major PDWORD minor PDWORD build OSVERSIONINFO osver ZeroMemory osver sizeof OSVERSIONINF