1

コードの出力はゼロである必要がありますが、エラーが発生しています。ガイドしてください。型変数を使用して構造体を初期化できますが、ポインターを使用して構造体全体を初期化するにはどうすればよいですか?

#include<stdio.h>

typedef struct student
{
  int roll_id[10];
  int name_id[10];
  int postn;
} student;



int main()
{

  student p; /// here i can do student p={ {0} };

  student *pptr=&p;
  pptr= { {0} };  /// but can i initialize in this way ?? //error: expected       
                      expression before ‘{’ token
  pptr->roll_id[9]=1;
  printf (" %d\n", pptr->postn);   
  return 0;
}
4

4 に答える 4

1

0 で初期化された構造体だけが必要な場合は、次のようにすることもできます。

struct student *pptr = calloc(1, sizeof(struct student));

または、投稿したコードに従ってください:

struct student p;
struct student *pptr = &p;

memset(pptr, 0, sizeof(struct student));

もちろん、これらのアプローチは、0 で初期化された構造体が必要な場合にのみ機能します。もっと派手なことをするには、それを書き出すか、memcpy魔法を使う必要があります。

于 2013-01-08T11:10:59.240 に答える
1

コメントでクリスが述べたように、「整数ではないもの」をポインターに割り当てています。{ {0} }代わりに、そのポインター (*ポインター)の内容に代入する必要があります。

*pptr= { {0} }; //bad!

とにかく、これはその構造を設定する正しい方法ではなく、次を使用する必要があります。

*pptr= (student){ {0}, {0}, 0 };

例として

巻き戻しによって指摘されたエラーを解決するために編集されました

于 2013-01-08T10:58:22.357 に答える
1

C99 以降を使用している場合は、複合リテラルを使用できます。そうしないと、各フィールドを個別に初期化することができず、初期化する必要があります。

リテラルの場合:

*pptr = (student) { 0, 0, 0 };

それなし:

pptr->roll_id[0] = 0;
pptr->name_id[0] = 0;
pptr->postn = 0;

更新roll_id編集しました。何らかの理由でとname_idフィールドが文字列だと思っていましたが、そうではありません。

memset()すべての値をゼロに初期化するために、これを使用する方が簡単かもしれません:

memset(pptr, 0, sizeof *pptr);

いつものように、これはsizeof pointer を使用する絶好の機会であることに注意してください。タイピングが減り、読みやすく、検証しやすくなります (ここにあるような妥当な変数名の場合)。

于 2013-01-08T10:59:33.150 に答える
0

以下のように使用

int main()
{

  student p[] = { {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};

  student *pptr = p;

  pptr->roll_id[9] = 1;
  printf (" %d\n", pptr->postn);   
  return 0;
}

structure のメンバーである配列全体を初期化したい場合は、上記のようにする必要があります。

于 2013-01-08T11:07:51.633 に答える