【问题标题】:Dereference Pointer to Struct Variable结构变量的解引用指针
【发布时间】:2020-10-03 07:17:04
【问题描述】:

我试图了解当取消引用指向结构的指针时我们得到什么值。

我的结构是。

    struct car
{
    int a = 5;
    int b = 10;
    int c = 2;
    int d = 14;
    int e = 20;
};

我在 main 函数中的代码是

int main()
{
    car  k1,k2,k3,k4,k5; // declare struct variable
    car* ptr1,*ptr2,*ptr3,*ptr4,*ptr5;// declare pointer to struct variable
    ptr1 = &k1;
    ptr2 = &k2;
    ptr3 = &k3;
    ptr4 = &k4;
    ptr5 = &k5;

    printf("*ptr1=%d *ptr2=%d *ptr3=%d *ptr4=%d *ptr5=%d  \n", *ptr1,*ptr2,*ptr3,*ptr4,*ptr5);
 };

当我取消对 ptr1 到 ptr5 的引用时。我得到的值与结构中成员的值相对应(值 a 到 e)。为什么我得到这个值。

【问题讨论】:

  • 这不是 C 代码。 C 不允许这样的结构字段初始化器。也许您正在使用 C++ 进行编码。如果是,请更新标签。
  • 你能澄清一下你的程序输出什么,你希望它输出什么。
  • When I dereference ptr1 to ptr5 当您这样做时,您会将 struct car 值传递给 printf,由于 %d 的原因,它需要 int 值。那就是UB(未定义的行为)。
  • 您混淆了 C 结构和 C++ 结构。在 C 中,结构的地址是第一个成员的地址。因此,您可以通过取消引用结构来打印第一个整数成员。 (这解释了您使用 printf"%d" 转换说明符)在 C++ 中,结构和类彼此相同,但从第一个成员的角度来看,不能保证与 C 结构相同。见First member of class
  • 如果您尝试使用std::cout 输出,您也使用printf 绕过error: no match for ‘operator<<’,但您使用printf 调用Undefined Behavior,因为*ptr1 等和 "%d" 之间的类型不匹配。您可以通过将指针转换为int* 来屏蔽它,例如*(int*)ptr1 -- 但是如果你不得不绕过一个错误 -- 无论如何,所有的希望都会失去......这看起来很像 XY 问题。见:What is the XY problem?——你需要完成什么?

标签: c++


【解决方案1】:

可变参数函数没有类型检查,实际上可能是双关语类型。本质上,您将结构内容作为原始值传递,格式字符串描述了如何处理它们。幸运的是,在这种情况下 struct 没有填充,因此前五个整数被相应地读取。 这种情况下的行为是未指定的,取决于编译器和 ABI 的实现。

【讨论】:

    【解决方案2】:

    为了能够打印结构,您需要重载operator <<。你的结构应该是这样的:

    struct car
    {
        int a = 5;
        int b = 10;
        int c = 2;
        int d = 14;
        int e = 20;
    
        friend std::ostream& operator<<(std::ostream& os, const car& c) {
          os << "Struct data:\n";
          os << "------------\n";
          os << "a var: " + std::to_string(c.a) + "\n";
          os << "b var: " + std::to_string(c.b) + "\n";
          os << "c var: " + std::to_string(c.b) + "\n";
          os << "d var: " + std::to_string(c.b) + "\n";
          os << "e var: " + std::to_string(c.b) + "\n";
          return os;
        }
    };
    
    

    那么,如果您要像这样打印取消引用的 ptr:

    std::cout << *ptr1 << std::endl;
    

    你会看到这样的输出:

    Struct data:
    ------------
    a var: 5
    b var: 10
    c var: 10
    d var: 10
    e var: 10
    

    你可以返回你想要的,取决于你。

    【讨论】:

      猜你喜欢
      • 2015-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-28
      • 1970-01-01
      • 2021-10-15
      • 2020-08-19
      • 2015-10-19
      相关资源
      最近更新 更多