c中的结构打印字段(动态内存分配)

我是C的菜鸟,并创建这个程序来帮助我学习。 目的是将足球运动员添加到球队并打印信息。

我正在尝试打印我的俱乐部结构的字段,但是当我的程序进入我的打印方法时,我的所有值都是垃圾或地址。 我怎样才能获得“真实”的价值观

#include  #include  #include  #define SIZE 8 typedef struct player { int id; char *position; } Player; typedef struct club { int size; Player *team[SIZE]; } Club; Player *create_player(int id, const char *description); void create_team(Club *club); void print_club(const Club *club); void add_player_to_club(Club *club, int id, const char *position); int main() { Club club; create_team(&club); add_player_to_club(&club, 1, "forward"); add_player_to_club(&club, 2, "goalie"); print_club(&club); return 0; } Player *create_player(int id, const char *description){ Player *player; player = malloc(sizeof(Player)); if(description == NULL){ player->position = NULL; } else { player->position = malloc(strlen(description) + 1); strcpy(player->position, description); player->id = id; } return player; } void create_team(Club *team){ team = malloc(sizeof(Club)); if (team == NULL) { return; } else { team->size = 0; } } void print_club(const Club *club) { int i = 0; if (club == NULL) { return; } else if (club->size == 0) { printf("No team members\n"); } else { for (i = 0; i team[i]->id, club->team[i]->position); } } } void add_player_to_club(Club *club, int id, const char *position){ if (club == NULL || club->size >= SIZE) { return; } else { Player player = *create_player(id, position); club->team[club->size -1] = &player; } } 

这是我调试会话的图片

调试器

问题1

create_team没有对main做任何有用的事情。 您正在更改函数局部变量的值。 因此club仍然未被初始化。 您继续使用它,就好像它是有效对象一样,这是导致未定义行为的原因。

您可以将该function更改为:

 void create_team(Club *team){ team->size = 0; for (int i = 0; i < SIZE; ++i ) { team->team[i] = NULL; // Unfortunate choice of variable names // but should be OK. } } 

问题2

您正在add_player_to_club中存储指向函数局部变量的add_player_to_club 。 该指针变为无效函数返回。

  Player player = *create_player(id, position); club->team[club->size -1] = &player; // Problem 

将其更改为:

  club->team[club->size] = create_player(id, position); club->size++; 

问题3

你也可以在print_club打印Player 。 团队中并没有总是SIZE数量的Player 。 改变线

  for (i = 0; i < SIZE; i++) { 

  for (i = 0; i < club->size; i++) {