访问指针内部的指针数组

时间:2020-03-13 17:06:54

标签: c pointers struct

我想创建一种名为 add_order 的方法,以将新订单添加到现有订单数组中。 main的前三行工作正常,直到那一点我都了解了指针,但是我在努力使用add_order方法时,在printf中也无法正常工作。如何访问指针内部的指针数组?

#include <stdio.h>
#include <stdlib.h>

typedef struct {
  int count;
  char type;
} *pizza;

typedef struct {
  int courier;
  int day;
  pizza p;
} *order;

typedef struct {
  order orders;
  int orderCount;
} *monthlyorders;

monthlyorders new_monthlyorders(order o) {
  monthlyorders m = malloc(sizeof(monthlyorders));
  m->orders = malloc(sizeof(order));
  m->orders = o;
  m->orderCount = 0;
  return m;
}

order new_order(int courier, int day, pizza p) {
  order o = malloc(sizeof(order));
  o->courier = courier;
  o->day = day;
  o->p = malloc(sizeof(pizza));
  o->p = p;
  return o;
}

pizza new_pizza(int count, char type) {
  pizza pizza = malloc(sizeof(pizza));
  pizza->count = count;
  pizza->type = type;
  return pizza;
}

monthlyorders add_order(monthlyorders m, order o) {
  m->orderCount = (m->orderCount)+1;
  (*(m->orders+1)) = malloc(sizeof(order));
  return m;
}

int main() {

  pizza p = new_pizza(2, 'A');
  order o = new_order(1, 1, p);
  monthlyorders m = new_monthlyorders(o);

  add_order(m, o);

  printf("%i\n", (*(m->orders+1)));

  return 0;
}

1 个答案:

答案 0 :(得分:1)

您只需要正确使用指针即可。您最有可能忘记做“订单”作为指针。让我知道它是否可以解决您的问题:

#include <stdio.h>
#include <stdlib.h>

typedef struct {
  int count;
  char type;
} *pizza;

typedef struct {
  int courier;
  int day;
  pizza p;
} *order;

typedef struct {
  order * orders; // order * orders -> create a pointer
  int orderCount;
} *monthlyorders;

order new_order(int courier, int day, pizza p) {
  order o = malloc(sizeof(order));
  o->courier = courier;
  o->day = day;
  o->p = malloc(sizeof(pizza));
  o->p = p;
  return o;
}

pizza new_pizza(int count, char type) {
  pizza pizza = malloc(sizeof(pizza));
  pizza->count = count;
  pizza->type = type;
  return pizza;
}

monthlyorders add_order(monthlyorders m, order o) {
  *(m->orders + m->orderCount) = o;
  m->orderCount++;
  return m;
}

monthlyorders new_monthlyorders(order o) {
  monthlyorders m = malloc(sizeof(monthlyorders));
  m->orders = malloc(1000); // You might need more cases (eg. 10000? )
  m->orderCount = 0;
  return add_order(m,o);
}

int main() {

  pizza p = new_pizza(2, 'A');
  order o = new_order(1, 1, p);
  monthlyorders m = new_monthlyorders(o);


  // Test cases
  order o2 = new_order(2, 1, p);
  add_order(m, o2);

  // You might want to print out data from your object rather than the object itself
  printf("%i\n", (*(m->orders))->courier);
  printf("%i\n", (*(m->orders))->day);
  printf("%i\n", (*(m->orders + 1))->courier);
  printf("%i\n", (*(m->orders + 1))->day);
  // Don't forget to free it
  free(m->orders);

  return 0;
}

编辑:考虑做伊恩说的话:替换

order o = malloc(sizeof(order)); 

order o = malloc(sizeof(*o)); 

以及类似的其他malloc调用