【问题标题】:uninitialized local variable used c++未初始化的局部变量使用c ++
【发布时间】:2022-01-12 18:51:10
【问题描述】:

为什么我不能用Strct结构的number字段的值来初始化整数变量num

#include <iostream>

struct Strct
{
    float number = 16.0f;
};

int main()
{
    Strct* strct;
    int num = strct->number;
    return 0;
}

错误列表:使用了 C4700 未初始化的局部变量 'strct'

【问题讨论】:

  • Strct* strct; -- strct 需要指向某个有效的地方,而现在它指向...?另外,你为什么对这么简单的代码使用指针?只需Strct strct; 即可,将-&gt; 更改为.
  • 我以为我的strct指向的是Strct结构,也就是指向它的类型
  • 没有。指针必须指向有效的实体、对象、活动实例,而不是类型。如果是这样,那么像这样的代码:char *c; *c = 'x'; 就可以了,如果不是这样。
  • 一个指针只是一个值,就像一个int。它的值是一个地址指针 可以指向它的类型(在本例中为Strct)。或者它的值可以是nullptr。或者它可以是未初始化的——这就是这里的情况(并且具有与 C++ 中未初始化的事物相同的未定义行为问题)。或者它可以是一个悬空指针。或者可以是一个野指针。
  • 去掉*,用.代替-&gt;,问题解决。 Strct strct; int num = strct.number;

标签: c++ pointers struct


【解决方案1】:

为什么我不能用Strct结构的数字字段的值来初始化整数变量num?

因为指针未初始化,因此它不指向任何对象。通过指针间接,甚至读取指针的值会导致未定义的行为。

我以为我的strct指向的是Strct结构,也就是指向它的类型

没有。指针不指向类型。对象指针指向对象。类型不是 C++ 中的对象。

16.0f 不是number 的值。 16.0f 是该成员的默认成员初始化程序。如果您创建Strct 类型的对象,并且您没有为该成员提供初始化程序,则默认成员初始化程序将用于初始化相关对象的成员。

那我可以定义一个返回这个结构地址的成员函数吗?

结构是一种类型。类型不存储在地址中。没有“类型的地址”这样的东西。


这是一个如何创建一个变量来命名类Strct的实例的示例:

Strct strct;

您可以使用成员访问运算符访问此变量的成员:

int num = strct.number;

这是一个如何创建不使用默认成员初始化器的实例的示例:

Strct strct = {
    .number = 4.2f,
};

【讨论】:

  • 从书架上掉下来的书开始放回原处。谢谢解释,虽然很初级,可惜我的脑子是这么安排的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-07
  • 1970-01-01
相关资源
最近更新 更多