struct对象代表什么?

时间:2017-05-25 13:35:44

标签: c++ c++11

#include<iostream>
using namespace std;



struct  A{

   int a;
   int s;
};
int main()
{
    A *S =new A();
    A  obj1=S[0];
    printf(" 0x%x",obj1);
}

我的问题是,当我看到外面看起来似乎是0x0; 并且在某些情况下它变为0xFFFFFFFF

有人可以解释一下吗?

1 个答案:

答案 0 :(得分:1)

您的程序有undefined behavior,因此错误(因为传递给printf的内容与" 0x%x"格式控制字符串不匹配,因为它的类型错误);另见answer

阅读Lattner's blog on undefined behavior(它也适用于C ++)

请注意printf是一个C库函数(所以你需要#include <cstdio>)。在正版C ++ 11中,你可以使用一些operator << on std::ostream-s,可能就像

std::cout << obj1 << std::endl;

并且该行不会编译(除非你定义了这样的操作符,你应该这样做。)

要解释实际行为(一般不可重现),您需要深入了解实现细节(并且您不希望:如果您这样做,请研究您的特定程序和C ++库的源代码和目标代码,您的编译器,您的操作系统,查看调用约定,指令集,ABI等...)。显示的garbage value(例如0xfffffff)会出现在某个相关的processor register或内存位置(call stack上)。

顺便说一下,如果你编译了所有警告&amp;调试信息(例如g++ -Wall -Wextra -gGCC)您将收到警告。我强烈建议您启用所有警告。

请注意,struct A{class A{public:相同,因此您可以定义一些显式构造函数(可以初始化字段)和一些输出operator<<

struct  A{
   int a;
   int s;
   A(int aa=0, int ss=0) : a(aa), s(ss) {};
};
std::ostream operator << (std::ostream&out, A a) { 
   out << "a=" << a << ",s=" << s;
   return out;
}

但您可能应该阅读rule of five,尤其是this