1

C (または C++) での連結リストの実装では、ノードのサイズとポインター変数の有効期間は? 例えば:

struct node
{
  int data;
  struct node *next;
}*ptr=NULL;

ノードのサイズを知りたいのですが、それは 4 バイトですか。第二に、ポインターはどのくらいの期間存続しますか?つまり、プログラムの実行全体を通して? 最後に、*ptrインスタンス変数またはデータ メンバーまたはオブジェクトを呼び出すのは適切ですか?

4

3 に答える 3

4

ノードのサイズを一般的に知ることはできません。ただし、特定のプラットフォームとライブラリのセットについては、コンパイル時にノードのサイズを知ることができます。

sizeof(struct node)

ノードのサイズがわかります。ノード内のすべてのメンバーを組み合わせた実際のサイズではない場合があることに注意してください。場合によっては、適切な操作に必要なメモリ アラインメント境界で構造体内のメンバーをアラインさせるために、パディングが必要になります。

さらに、ポインターには特定のサイズがありません。それらは、必要なメモリ アドレスを収容するのに十分な大きさですが、満たす必要がある唯一の要件です。32 ビット環境と 64 ビット環境ではポインター サイズに大きな違いがあり、同じハードウェア上でサポートされている 2 つのビットネス環境間で移行しない場合でも、ハードウェア プラットフォーム異なれば、ポインター値を格納するためのメモリ要件も異なる場合があります。

「ポインターを格納するための 4 バイト」というのは、C を使用するすべてのコンピューターが Intel CPU であり、Pentium ファミリーのチップであり、32 ビット コードしか実行できないという一般的な誤解によるものです。それは当時は正しくない仮定でしたが、現在それを仮定することも同様に正しくありません。

それが考慮された後でも、構造体の配列では、正しいメモリ配置のために配列要素間のパディングが必要になる場合があります。その結果、構造体のサイズがわかっている場合でも、要素の配列がバイトXのメモリ領域に収まるかどうかは保証できません。X * sizeof(struct node)

求めている答えを見つけるために使用sizeof(...)しますが、サイズを取得したいほとんどすべてがsizeof(...)演算子にあることを確認してください。

ポインターの寿命に関しては、プログラムが実行されている限り存続します。ただし、格納されている値は、node->next実際には意味のあるアドレスを参照していない可能性があります。 はアドレスを保持するように設計されていますが、a のニーズを満たすビット パターンの開始を指定しないアドレスを指すようnode->nextにだます方法が多すぎます。 node->nextstruct node

この C 言語の「問題」は、ポインター型の操作を不可能にすることによって、C を「改善」することを意図した後続の言語である程度修正されました。代わりに、言語はポインター操作の安全なサブセットを許可しました。つまり、実際にはポインターがありませんでした (そのため、参照と呼ばれていました)。Java と C# はそのような 2 つの言語ですが、ポインタに対する真に危険な操作を否定する言語が多数あります。

ポインターを変数のインスタンスと呼ぶのは適切ではありません。ポインターは実際にはメモリ アドレスを保持する変数であるためです。保持するメモリアドレスに、ポインタの「型」を満たすビットパターンが含まれているという厳密な要件はありません。これは、C++ が C との互換性を維持するために保持した従来の C の問題の 1 つにすぎません。また、インスタンス変数はオブジェクト指向の用語を示唆する傾向があり、C は (デフォルトの形式では) オブジェクト指向の保証を提供できません。 C に対するオブジェクト指向プログラミングの用語は不適切です。

同様に、構造体はクラスではなく、構造体のメンバーはクラスのメンバーとは少し異なるルールに従います。最大の「わずかに異なる」ルールは、構造体の宣言をプログラムの残りの部分から隠すように細心の注意を払っていない限り、構造体のメンバーは一般にパブリックにアクセス可能であるということです (これには、多くの C の演習を行って作成する必要があります)。あなたのプログラムはまだ動作します)。

于 2013-08-20T03:04:56.627 に答える
2
  1. ノードのサイズは、コンピューターとコンパイラによって異なります。使用sizeof(struct node);して取得します。4バイトではありません。32 ビット環境では、8 ( の場合は 4 バイト、 の場合はint4 バイトstruct node *) です。

  2. ptrプログラムの実行中の寿命。ptrグローバル変数です。

  3. ptrインスタンス変数*ptrであり、メモリがptr指す ことを意味します。

于 2013-08-20T03:13:56.563 に答える
0

Sizeof はコンパイル時の操作です。ノードは構造体です。したがって、ノードのサイズは、構造内のすべてのメンバーのサイズの合計です。したがって、整数とポインターがあります。ノードのサイズは、整数のサイズ + ポインターのサイズです。ライフタイム: メモリは動的に割り当てられます。free を呼び出すまで、ノードは存続します。削除操作を実行すると、良いプログラマ スタイルで、そのノードに割り当てられたメモリが解放されます。

于 2013-08-20T03:55:58.203 に答える