C “指针”;地址;在一个结构中分配了内存,但当我在另一个函数中调用它时,它可以';行不通

C “指针”;地址;在一个结构中分配了内存,但当我在另一个函数中调用它时,它可以';行不通,c,pointers,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指针指向一个book结构,该结构也在堆中分配内存 这样做之后,当我以这种方式在另一个函数中调用

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

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

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

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

这样做之后,当我以这种方式在另一个函数中调用它时:

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("----------------------");
   }

}
void打印书籍(阵列书籍)视图
{
int j;
int limit=books.num;
对于(j=0;jname);
printf(“书本价格:%lf\n”,bk->price);
认沽权(“-------------------------”);
}
}
我的编译器说

错误:“void”类型的操作数,其中需要算术或指针类型。生成1个错误

我发现表达式
books.addr[j]
有问题,如果我简单地用
books.addr
替换它,它就会工作


有人能告诉我如何解决这个问题吗?

这是一个运算符优先级的问题


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

这是运算符优先级的问题

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

错误:“void”类型的操作数,其中需要算术或指针类型。生成1个错误

您正在无效指针上使用指针算术,这是不允许的(addr[j])

首先,您必须强制转换void指针

((book *)(books.addr))
然后取消对它的引用

((book *)(books.addr))[j]
错误:“void”类型的操作数,其中需要算术或指针类型。生成1个错误

您正在无效指针上使用指针算术,这是不允许的(addr[j])

首先,您必须强制转换void指针

((book *)(books.addr))
然后取消对它的引用

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

拥有和分配空指针数组比
book
s更重要的是什么?拥有和分配空指针数组比
book
s更重要的是什么?