2017-05-25 61 views
-7
#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结构对象代表什么?

有人可以解释一下吗?

+2

这显然不是C.为什么需要C标签? – BLUEPIXY

+8

这是UB,任何事情都可能发生。 – deviantfan

+0

为什么会发生任何事情? – Mukesh

回答

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上)发生的情况。

顺便说一句,如果你编译的所有警告&调试信息(例如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

+0

我明白你的一部分。因为我不能做cout << obj1。 – Mukesh

+0

这些值描述了什么? 0x0和0xFFFFFFFF – Mukesh

+0

@Mukesh第二个原因是你有未定义的变量。 ...您的值是十六进制数字(0和4294967295(或2的补码中的-1))。你应该知道,当使用%x – deviantfan