#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结构对象代表什么?
有人可以解释一下吗?
#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结构对象代表什么?
有人可以解释一下吗?
你的程序有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 -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。
我明白你的一部分。因为我不能做cout << obj1。 – Mukesh
这些值描述了什么? 0x0和0xFFFFFFFF – Mukesh
@Mukesh第二个原因是你有未定义的变量。 ...您的值是十六进制数字(0和4294967295(或2的补码中的-1))。你应该知道,当使用%x – deviantfan
这显然不是C.为什么需要C标签? – BLUEPIXY
这是UB,任何事情都可能发生。 – deviantfan
为什么会发生任何事情? – Mukesh