コードに含まれるエラーに関して、最初のエラーは静的な数の MyStruct 要素を構築し、それらを ms 配列に格納するため、ms は MyStruct 構造体の配列です。もちろん、これは 2 つの要素のみであることを意味していましたが、後でms配列に他の要素を追加することはできません.MyStruct要素の数を制限していますが、リンクリストがある2番目のケースでは、必要な数のMyStruct要素を連鎖させることができ、これは動的数につながります. MyStruct 要素の 2 番目のケースでは、実行時に必要な数の MyStruct を追加できます。2 番目のケースは、概念的にメモリ内で次のようになります。
[ MyStruct#1 ] ----> [ MyStruct#2 ] ----> [ NULL ]
NULL は、たとえば MyStruct#3 である可能性がありますが、最初
[ MyStruct#1 ] ----> [ MyStruct#2 ]
のものは、それだけです。MyStruct#3 を追加することはできません。
では、あなたが書いたコードを見てみましょう:
struct MyStruct
{
int num;
} ms[1];
ms[1]
実際には、1 つの MyStruct 要素の ms 配列を作成することを意味します。
次のコードは、次の 2 つを作成したことを前提としています。
ms[0].num = 5;
ms[1].num = 15
したがって、次のようになるはずです。
struct MyStruct
{
int num;
} ms[2];
そして、それはうまくいきます!私が作成した簡単な図を覚えておいてください。
[ MyStruct#1 ] ----> [ MyStruct#2 ]
2 番目のケース:
struct MyStruct
{
int num;
MyStruct *next;
};
MyStruct *ms = new MyStruct;
ms->num = 5;
ms->next = new MyStruct;
ms->next->num = 15;
new
ソース コードを保存する.cpp
と、エラーなしで C++ アプリケーションとしてコンパイルできるため、このコードでは C++ 演算子を使用しますが、C の場合、構文は次のように変更する必要があります。
struct MyStruct
{
int num;
MyStruct *next;
};
MyStruct *ms = (MyStruct *) malloc(sizeof MyStruct);
ms->num = 5;
ms->next = (MyStruct *) malloc(sizeof MyStruct);
ms->next->num = 15;
#include <stdlib.h>
関数に含めることを忘れないでください。malloc()
この関数の詳細については、こちらを参照してください。
そして、最初のケースとして、リンクされたリストの私の図を思い出してください:
[ MyStruct#1 ] ----> [ MyStruct#2 ] ----> [ NULL ]
ここで、NULL は実際には ms->next MyStruct 構造の次の要素です。それを説明するために、ms->next が MyStruct のポインターであり、それを割り当てたことを思い出してください。ヒープ内のスペースなので、同じサイズの MyStruct 構造のメモリ ブロックを指しています。最後に、いつ連結リストを使用し、いつ配列を使用するかについてのStackoverflowの質問です。これにより、世界中の人々が連結リストを好む場合と配列を好む場合がある理由を正確に理解できます。