结构与另一个结构

时间:2014-01-25 15:11:39

标签: c structure

如何从 类别 结构中正确访问 价格 成员?

这是代码:

#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) 解决这个问题的正确方法是什么? (我的意思是拥有另一种结构的结构)

3 个答案:

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