-3

以下の構造体へのポインタの例では

   #include<stdio.h>
   #include<stdlib.h>

   struct siva {
   int a;
   };

   typedef struct siva *s1;

    void main()
   {
    s1 b=(s1)malloc(sizeof(s1*));
    b->a=8;
    printf("\n The vlue is s1->a is %d",b->a);
    free(b);
  }

上記のコードでは、変数 b は宣言されていませんが、このコードがどのように機能するか

この行で

   s1 b=(s1)malloc(sizeof(s1*));

b にメモリを割り当てる方法と、sizeof() で s1* を使用する理由。s1とs1の違いは何ですか

4

3 に答える 3

2

s1以下は、へのポインターとしての の型の 宣言です。struct siva

typedef struct siva *s1;

以下はへのポインタですs1(例: へのポインタへのポインタstruct siva)

s1*

malloc で指定されたサイズが間違っています。

s1 b=(s1)malloc(sizeof(struct siva));

s1を指すようにstruct siva。構造体の最初の要素のアドレスが構造体のアドレスであるという理由だけで機能しますが、これは基本的に危険なことです。

b割り当てられているのと同じ行で宣言されます。

    s1 b=(s1)malloc(sizeof(s1*));
//  ^^^^

C では、関数の戻り値から変数を初期化することは許可されていないことに注意してください。

于 2012-05-09T07:11:36.577 に答える
1

s1 と s1* の違いは何ですか

  • sizeof(s1)s1のサイズ、つまり へのポインタのサイズが得られsivaます。
  • sizeof(s1*)へのポインタのサイズ、つまりへのポインタへのポインタのサイズを生成します。s1siva

最後に、次の行:

s1 b=(s1)malloc(sizeof(s1*));

読む必要があります:

s1 b=(s1)malloc(sizeof(struct siva));
于 2012-05-09T07:11:20.387 に答える
0

このコードは、少なくとも作成者が意図したとおりには 機能しません。sizeof (s1*)へのポインタのサイズを与えるs1.これは へのポインタへのポインタのサイズであるstruct siva

まず、その行を read に変更することをお勧めします

s1 b = malloc(sizeof *b);

まず、キャストは C89 以降不要であり、実際に問題を引き起こす可能性があります。非常に古い(C89 より前の) コンパイラを使用している場合を除き、 mallocorの結果をキャストしないでくださいcalloc

次に、*b型を使用する代わりに、式を sizeof のオペランドとして使用します。b少しすっきりしていて、宣言とmalloc呼び出しの間で型をまっすぐに保つことを覚えておく必要はありません。の型bs1の同義語である is であるためstruct siva *、 の型は*bisstruct sivaです。

malloc呼び出しの一般的な形式は

T *p = malloc(sizeof *p * number_of_elements);

また

T *p;
...  // some bit of code
p = malloc(sizeof *p * number_of_elements);

の 1 つのインスタンスを割り当てている場合はT、明らかに* number_of_elements呼び出しから をドロップできますmalloc

最後に、ちょっとしたアドバイス - typedef の背後にポインターを隠さないでください。 s1ポインター性をまったく示していないため、呼び出し のターゲットであるb べきかはすぐにはわかりません。malloc

于 2012-05-09T11:31:54.990 に答える