2017-05-25 66 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