代码的输出必须为零,但我有错误,请指导。 我可以使用其类型变量初始化结构,但是如何使用指针初始化整个结构?
#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;
}
答案 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_id
和name_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;
}
如果要初始化作为结构成员的整个数组,则必须如上所述。