#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
有人可以解释一下吗?
答案 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 -g
与GCC)您将收到警告。我强烈建议您启用所有警告。
请注意,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。