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} }给该指针的内容(*指针):

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

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

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

举个例子

编辑以解决 unwind 指出的错误

于 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_idandname_id字段是字符串,但它们不是。

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

memset(pptr, 0, sizeof *pptr);

请注意,与往常一样,这是sizeof 与指针一起使用的绝佳机会,因为减少了打字并且更易于阅读和验证(对于我们这里的合理变量名称)。

于 2013-01-08T10:59:33.150 回答
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 回答
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;
}

如果要初始化作为结构成员的整个数组,则必须像上面那样做。

于 2013-01-08T11:07:51.633 回答