结构初始化

时间:2013-01-08 10:54:15

标签: c arrays structure

代码的输出必须为零,但我有错误,请指导。 我可以使用其类型变量初始化结构,但是如何使用指针初始化整个结构?

#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 个答案:

答案 0 :(得分:1)

正如克里斯在评论中所说,你正在为指针分配“不是整数”。您应该将{ {0} }分配给该指针的内容(*指针):

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

无论如何,这不是填充该结构的正确方法,您应该使用:

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

作为例子

编辑

以解决unwind指向的错误

答案 1 :(得分:1)

如果您使用的是C99或更高版本,则可以使用compound literals。否则你不能,并且必须单独初始化每个字段。

使用文字:

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

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

更新已编辑,由于某种原因,我认为roll_idname_id字段是字符串,但它们不是。

为此可能更容易使用memset(),将所有值初始化为零:

memset(pptr, 0, sizeof *pptr);

请注意,这是一个将sizeof 与指针一起使用的绝佳机会,因为减少了输入并且更易于阅读和验证(对于合理的变量名称,例如我们在这里。)

答案 2 :(得分: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魔法。

答案 3 :(得分: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;
}

如果要初始化作为结构成员的整个数组,则必须如上所述。