以下是我的代码。编译器生成错误
#include<stdio.h>
struct Shelf{
int clothes;
int *books;
};
struct Shelf b;
b.clothes=5;
*(b.books)=6;
编译器在上面的代码中为语句b.clothes=5;
和b->books=6;
生成如下错误。
error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘->’ token
我不是C的初学者,我相信我写的是正确的。请妥善解决我的问题
答案 0 :(得分:5)
<强>第一强>
你不能这样做
struct Shelf{
int clothes;
int books;
};
struct Shelf b;
b.clothes=5;
b.books=6;
在全球范围内
您可以在函数
中指定值int main (void )
{
b.clothes=5;
b.books=6;
}
或者在声明
上初始化值struct Shelf b = { .clothes = 5, .books = 6 };
此外,您可以看到b
不是指针,因此使用->
不正确:使用.
访问struct的成员。
<强> SECOND 强>
您的struct有一个指针成员book
struct Shelf{
int clothes;
int *books;
};
您可以做的是将其设置为另一个变量的地址,例如
int book = 6;
struct Shelf b = { .clothes = 5, .books = &book };
或为该指针分配内存,如
int main (void )
{
b.clothes=5;
b.books=malloc(sizeof(int));
if (b.books != NULL)
{
*(b.books) = 6;
}
}
BTW我想你想要一本书,所以
int main (void )
{
b.clothes=5;
b.books=malloc(sizeof(int) * MAX_N_OF_BOOKS);
if (b.books != NULL)
{
for (int i=0; i<MAX_N_OF_BOOKS; i++)
b.books[i] = 6;
}
}
竞争测试代码
#include <stdio.h>
#include <stdlib.h>
struct Shelf
{
int clothes;
int *books;
};
int main(void)
{
struct Shelf b;
b.clothes = 5;
b.books = malloc(sizeof(int));
if (b.books != NULL)
{
*(b.books) = 6;
}
printf ("clothes: %d\n", b.clothes);
printf ("book: %d\n", *(b.books) );
}
输出
clothes: 5
book: 6
答案 1 :(得分:2)
b
是一个结构,不是指针,因此->
不正确。
这就像做(*b).books
,这是错误的。
struct Shelf{
int clothes;
int *books;
};
结构的一个数据成员是指针,但是:
struct Shelf b;
不是指针,它只是我之前说过的结构。
关于你的评论问题:
b.clothes=5;
是对的。这样的事情也可以:
int number = 6;
b.books = &number;
答案 2 :(得分:0)
->
运算符用于通过指针访问struct的成员。 b
未动态分配,因此b->books=6;
错误。您应该首先为成员books
分配内存,然后取消引用它。
b.books = malloc(sizeof(int));
*(b.books)= 6;