1)Cのドット演算子は、構造体のメンバーにアクセスできるようにする単なる言語構造です。構造体のメンバーにアクセスするために使用しているので、完全に合法です。機能しない理由はありません。
C#では、「。」を使用することもできます。オブジェクト内の関数を呼び出します。つまり、C#で次のクラスがある場合
public class foo()
{
public void print_hello()
{
Console.Writeline("Hello,World");
}
}
次のように使用します。
foo object1 = new foo();
foo.print_hello();
2)
この線
stack *s1
s1を構造体statへのポインタとして宣言しますが、これで終わりではありません。これを使用して、それぞれがスタック構造体を含むメモリの複数の領域を指すことができます。
配列(たとえば、intの配列)を宣言すると、従来の方法で宣言できます。
int integersArray [10];
(このようにして、プログラムはメモリを自動的に割り当てます。心配する必要はありません)。ポインタを使用することもできます。その場合、配列を次のように宣言します。
int * integersArray;
これは、割り当て方法に応じて、メモリの1つまたはさまざまなセグメントへのポインタになります。上記のコードは、前のコードとは異なり、メモリを割り当てず、構造体へのポインタを宣言するだけであることに注意してください。次のようにして、メモリを明示的に割り当てる必要があります。
integersArray = malloc(10*sizeOf(int));
Wichは、intの10倍のサイズ、つまり10個の整数を保持するのに十分なメモリを割り当てます。どちらの場合も、integersArrayを通常の配列とコードとして使用できます
printf("%d",integersArray[0]);
動作します。2番目のケースでは、ポインターをインクリメントまたはデクリメントすることにより、配列内を移動できます。することによって
integersArray++
ポインタを次のメモリセクションに移動しています。integersArray+=11を実行する場合。、配列に10の位置がある場合、メモリの無効なセグメントになり、何かが発生する可能性があります(保護されたメモリセグメントに入ると、上記のコメントで指摘されているように、プログラムは終了します)。
@Alex:セグメンテーション。彼のランダムなポインタの逆参照が(偶然に)彼のメモリセグメント内にある限り、Cは文句を言わず、そのメモリ位置にあるゴミを受け取ります。彼が自分のセグメントの外に到達するとすぐに、カーネルは彼のプロセスを強制終了する可能性があります。–jforberg1時間前
あなたのプログラムは基本的に同じことをしていますが、代わりにs1を使用しています。
3)コードのこの部分
s1=(stack*)malloc(sizeof(stack));
タイプスタックの1つの構造を保持するのに十分なメモリを割り当てています。一般に、n個の要素にメモリを割り当てるには
yourPointer = malloc(n*sizeof(structure));
では、このように構造にアクセスしようとすると、なぜプログラムが機能するのでしょうか。
s1[1].node.val=20;
printf("%d",s1[1].node.val);
幸運にも有効なメモリにアクセスできると思いますが、必ずしもそうとは限りません。動的メモリを扱うときは、細心の注意を払うことをお勧めします。
注:上記が十分に明確であったとしても、K&Rの本をチェックすることを強くお勧めします。