2012-01-27 6 views
0

私はポインタの記法に次の違いを理解できないようです、誰かが私を導くことができますか?ポインタの構文クエリ

typedef struct some_struct struct_name; 
    struct_name this; 
    char buf[50]; 
    this = *((some_struct *)(buf)); 

は今、私は少しの周りにプレーしようとしたように上記のことをした:私の知る限り、私は実装の両方が同じ結果を生成するべきだと思い心配として、誰かが私を導くことができる

struct some_struct * this; 
    char buf[50]; 
    this=(struct some_struct *)buf; 

2つの間に違いがあるかどうか、もしそうなら、ある人がそれを指摘することができますか?

ありがとうございました。

+1

"this"を変数名として使用する習慣から脱出してください。あなたがCをやっているなら、あなたはいつかC++をやるつもりです。あなたはその習慣を後悔するつもりです。 –

+0

@PaulTomblin:CとC++は異なる言語です。私はC言語の変数名として "this"を使うことはそれほど大したことではないと思います。 –

+0

@ Paul Tomblinアドバイスをいただき、ありがとうございました。私は実際には物事をクリアして、意図せずにこれを変数名として書きました。 – Abdullah

答えて

3

最初のスニペットでは、thisはポインタではなく、some_structのインスタンスです。あなたが割り当てたのは、それがsome_structのインスタンスであるかのように、bufにあるものの浅いコピー(つまり、memcpy())でした。

2番目のスニペットでは、thisがポインタで、アドレスがbufになっています。

基本的にまとめると、最初のスニペットthisはポインタではなく、構造体がその中にコピーされます。 2番目のコードでは、ポインタであり、bufと同じメモリに割り当てられています(つまり、コピーではありません)。

+0

ありがとう、それはそれを説明します:) – Abdullah

+0

@Abdullah、あなたは少し速すぎます。この回答は正しいです(私は+1しました)が、あなたのコードにある隠された問題を教えてくれるわけではありません。私の答えも見てください。 –

0

"this"は "buf"の最初のメモリ位置を示します。最初の例では、コンパイラエラーが発生します(Cで構造体を割り当てることはできません=、私は間違っている可能性があります)、またはbufの内容(sizeof(struct_name)まで)がコピーされますこれはスタックに常駐しています。

0

両方のアプローチには問題があります。

  • 整列:bufは、構造タイプの変数に対して適切に整列されていない可能性があります。もしそうなら、これは未定義の振る舞い(UB)を生成します。最良の場合、プログラムを中止しますが、それよりも悪いことが起こる可能性があります。
  • 初期化:最初のケースでは、読み込みのために初期化されていないメモリにアクセスします。あなたに不特定のデータを与える最良の場合、それはいくつかのランダムなバイトです。最悪の場合、charはプラットフォーム上の符号付き整数型で、上記のようにchar => UBのトラップ表現をヒットします。 (あなたは、ポインタのもう一方の端にあるオブジェクトにアクセスしようとしたら、あなたの第二の場合は、同じ問題が発生します。)

すべてのことを避けるために、どのように:

  • 常にはあなたの変数を初期化。単純な= { 0 }はすべての場合に行う必要があります。
  • バイトのための一般的なタイプとしてcharを使用していないが、unsigned char
  • を使用しないが、別のデータ型に任意のアライメントのバイトのバッファを唱えることはありません。必要に応じて、それ以外の方法で行う場合は、structオブジェクトをunsigned charにキャストします。
+0

ありがとうたくさんのジェンス、私は将来、このような間違いを避けるために挑戦します:) – Abdullah