一个指针" addr"在一个结构中分配了内存,但当我在另一个函数中调用它时,它无法工作

时间:2017-04-19 15:17:49

标签: c pointers

在C文件的开头,我定义了两个这样的结构。

typedef struct
{
    char name[LEN];
    double price;
} book;

typedef struct
{
    void *addr;
    int num;
} Array;

Array book;

稍后,我使用malloc(sizeof(void *)*len)为指针addr分配内存。 void指针指向一个书结构,该结构也在堆中分配内存。

执行此操作后,当我以这种方式在另一个函数中调用它时:

void print_view_of_books(Array books)
{
   int j;
   int limit = books.num;
   for(j=0; j<limit; j++)
   {
      book * bk = (book *)books.addr[j]; 
      printf("Book title: %s\n", bk->name);
      printf("Book price: %lf\n", bk->price);
      puts("----------------------");
   }

}

我的编译器说

  

错误:类型&#39; void&#39;的操作数需要算术或指针类型的地方。生成1个错误。

我发现表达式books.addr[j]存在问题,如果我将其替换为books.addr,则可以使用。

有人可以告诉我如何解决问题吗?

2 个答案:

答案 0 :(得分:2)

这是运算符优先级的问题。

book * bk = (book *)books.addr[j];更改为book * bk = ((book *)books.addr)[j];可以解决问题。

答案 1 :(得分:0)

  

错误:类型&#39; void&#39;的操作数需要算术或指针类型的地方。生成1个错误。

您正在对不允许的void指针使用指针算法(addr [j])。

首先你需要施放空指针

((book *)(books.addr))

然后取消引用它

((book *)(books.addr))[j]