3

文字配列のアドレスを構造体ポインタに渡しても大丈夫ですか?

  typedef struct {
  int ID;
  word32 Myports;
  stripports gd[256] ;
  }Table;

  typedef struct {
  oldxmd used;
  newip  ip;
  newxmd new;
  }stripports;

  char buffer1[256];

  Table *tableptr = buffer1 ;

  tableptr ->ID = 15 ;
  tableptr ->Myports= somenumber ;
  tableptr ->gd[0].used = somenumber ;

難しいのは、 tableptrが配列の開始アドレスを受け入れる理由を関連付けることができないことです。私の最善の策は、上記のコードが正しくないか、安全ではないということです。

キャストは後で採用されましたが、なぜ配列を受け入れるのですか?

 Table* tableptr = (Table*)buffer1;

Table *tableptr = buffer1 ;Table* tableptr = (Table*)buffer1;その後の多くのテストで置き換えられました。

キャストせずに、structポインタは新しく作成されたポインタのアドレス以外の値を取ることができますstructか?

私はリポジトリに多くの作者によって書かれた一連のテストを持っています、そしてそれは本当に紛らわしいです。

4

2 に答える 2

1

文字配列のアドレスを構造体ポインターに割り当てることは保証されておらず、アラインメントの問題が発生する可能性があります。一部のアーキテクチャではint、通常、文字配列は任意のアドレスから開始できますが、s は偶数アドレスにのみ配置できます。

バッファ オーバーランの問題もあります。型が文字配列よりも大きい場合、Table他の変数を上書きしたり、メモリ保護エラーが発生したりする可能性があります。

これらの問題は両方とも、変更することで克服できます

char buffer1[256];

char *buffer1 = (char*)malloc(sizeof Table);
于 2012-08-28T14:17:01.643 に答える
0

いいえ、大丈夫ではありません。

キャスト

Table* tableptr = (Table*)buffer1; 

コンパイラに「黙ってやれ!」と指示するだけです。魔法のように機能するわけではなく、コンパイラが文句を言わないようにするだけです。

于 2012-08-28T14:14:44.910 に答える