为什么我的C代码出错了

时间:2017-05-09 15:04:34

标签: c pointers

以下是我的代码。编译器生成错误

#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的初学者,我相信我写的是正确的。请妥善解决我的问题

3 个答案:

答案 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;