如何从 类别 结构中正确访问 价格 成员?
这是代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SMAX 128
typedef struct {
int price;
char favCharacter[SMAX], edition[SMAX];
} category;
typedef struct {
char title[SMAX], fname[SMAX], lname[SMAX];
category *cat;
} book;
int main(int argc, char **argv) {
book *data = malloc(100 * sizeof(book));
(data->cat)->price = 10; //1
printf("\n\n(*(data->cat)).price is: %d%s", (data->cat)->price, "\n\n");
return 0;
}
我的第一次尝试失败(// 1) 解决这个问题的正确方法是什么? (我的意思是拥有另一种结构的结构)。
答案 0 :(得分:1)
您正在为book
分配内存,但不会为书籍中的cat
分配内存。这是一个例子:
/* allocate a hundred books */
book *data = malloc(100 * sizeof *data);
/* allocate one cat per book */
for (i = 0; i < 100; ++i)
data[i].cat = malloc(sizeof *data[i].cat);
/* now you can use it */
for (i = 0; i < 100; ++i)
data[i].cat->price = 50;
注意:在继续使用返回的内存之前,您需要添加检查以确保malloc
不会失败。此外,最好避免上面的100
等幻数。此外,不要忘记稍后free
记忆。
答案 1 :(得分:1)
您正在分配一系列图书:
book *data = malloc(100 * sizeof(book));
因此,您应该在访问其内容之前访问数组元素:
data[0].cat->price = 10; // lets access element 0 for example.
但是,首先,您还必须为每个数组元素中的cat
变量分配数据:
for ( int i = 0; i < 100; i++ ) {
data[i].cat = malloc(sizeof(category));
}
现在您可以正确访问您的元素。
不要忘记释放分配的内存。
答案 2 :(得分:0)
更改
book *data = malloc(100 * sizeof(book));
(data->cat)->price = 10; //1
printf("\n\n(*(data->cat)).price is: %d%s", (data->cat)->price, "\n\n");
到
// 1. need explicit conversion
book *data = (book *) malloc(100 * sizeof(book));
// 2. allocate category for book *data
for (int i=0; i<100; i++)
data[i].cat = (category *) malloc(sizeof(category));
// 3. setting
(data[0].cat)->price = 10;
// 4. read
printf("\n\n(*(data->cat)).price is: %d%s", (data[0].cat)->price, "\n\n");