2017-01-06 3 views
0

構造体の最初の要素のアドレスが構造体のアドレスと同じであることがわかりました。しかし、構造のアドレスを逆参照しても、最初のデータメンバの値は返されません。しかし、最初のデータメンバーの参照解除アドレスは、その値を返します。例えば。構造体のアドレス= 100、構造体の最初の要素のアドレスも100です。逆参照は、両方で同じように動作するはずです。最初のメンバーの値を取得する構造体を参照しない

コード:

#include <iostream> 
#include <cstring> 

struct things{ 
    int good; 
    int bad; 
}; 

int main() 
{ 
    things *ptr = new things; 
    ptr->bad = 3; 
    ptr->good = 7; 
    std::cout << *(&(ptr->good)) <<" " << &(ptr->good) << std::endl; 
    std::cout << "ptr also print same address = " << ptr << std::endl; 
    std::cout << "But *ptr does not print 7 and gives compile time error. Why ?" << *ptr << std::endl; 
    return 0; 
} 
+0

'*&some_type'は常に限り、あなたはどんな奇抜な演算子のオーバーロードを持っていないとして'あなたにsome_type'を与える必要があります。 – NathanOliver

+0

ポインタを逆参照すると、ポインタが指している値が得られます。ポインタが構造体を指している場合、 "value"は*構造体*です。 –

+0

また、最初のメンバ*のアドレスは構造体のアドレスと同じでも構いませんが、構造体へのポインタは最初のメンバへのポインタではありません。タイプは最初とは異なっています。 –

答えて

0

コンパイラが収集するために使用するどのようなサイズとアライメントを知っているので、あなたは、構造体の最初の要素からポインタに、をStructにポインタのキャストを行うことができますメモリからの値。 "きれいな"キャストが必要な場合は、最初に "VOIDポインタ"に変換することを検討できます。
_(構造体*)(VOID *)に(FirstElem *)_
関連項目へ: Pointers in Stackoverflow
はそれが役に立てば幸い!

+1

'X *'から'void *'そして 'X *'以外のものに戻ると、プログラムが不正になります。 –

+0

@RichardHodges正しく処理しない場合。マイクロソフトでも、[ドライバ開発フレームワークコード](https://github.com/Microsoft/Windows-driver-samples)で使用しています。 –

+0

@フェルナンド:Microsoftがコードで何かをしているということは、正しいことを意味するものではありません。一般に、これは厳密なエイリアシング規則に違反します。編集:私は、Microsoftが正しく何らかの形でそれを処理していることを確信している、最初の要素の前に構造体にパディングを強制すること、それはOPに与えるための良い勧告ではない。 – AndyG

0

*ptrは、のタイプのインスタンスを返します。そのためには、operator <<が定義されていないため、コンパイル時エラーが発生します。

構造体は配列と同じではありません。つまり、必ずしも最初の要素へのポインタには崩壊しません。実際には、コンパイラは構造体の中でフリーである(そして多くの場合)insert paddingを特定のバイト境界に合わせるようにします。だからstructが配列と同じように(悪い考え)崩壊することがあっても、単純に印刷すると最初の要素の印刷が保証されません!†

私はこれらの境界は実装依存であり、多くの場合、pragma pack

0
などのプリプロセッサ文を経由して、いくつかの方法で制御することができ int[]

のようなCスタイルの配列を意味します

構造体の最初の要素のアドレスが構造体のアドレスと同じであることがわかりました。

あなたがこれを見つけた場所は、C++標準ではありませんでした。一般的なケースでは間違った仮定です。

このパスを続けると、悲惨さと苦痛があります。

0

theseのいずれかを試してみてください:

#include <iostream> 
#include <cstring> 

struct things{ 
    int good; 
    int bad; 
}; 

int main() 
{ 
    things *ptr = new things; 
    ptr->bad = 3; 
    ptr->good = 7; 

    std::cout << *(int*)ptr << std::endl; 
    std::cout << *reinterpret_cast<int*>(ptr) << std::endl; 

    int* p = reinterpret_cast<int*>(ptr); 
    std::cout << *p << std::endl; 
    return 0; 
} 
関連する問題