#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