【问题标题】:printing fields of structure in c (dynamic memory allocation)在 c 中打印结构字段(动态内存分配)
【发布时间】:2016-11-02 18:03:02
【问题描述】:

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

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

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

#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 < SIZE; i++) {
            printf("Id: %d Position: %s\n", club->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;

    }
}

这是我调试会话的照片

Debugger

【问题讨论】:

  • 看看下面的答案。尽管有一些错误,但您的代码的整体结构还可以。

标签: c memory-management


【解决方案1】:

问题 1

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

您可以将该功能更改为:

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 中。该指针变为无效函数返回。

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

改成:

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

问题 3

您也可以在Players 中打印print_club。团队中并不总是有SIZE 数量的Players。换行

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

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

【讨论】:

  • 不应该是 club-&gt;team[club-&gt;size ] 而不是 club-&gt;team[club-&gt;size -1] 吗?而club-&gt;size应该自增,create_team的内容其实应该只是team-&gt;size = 0;
  • @MichaelWalz,是的。 size 也需要立即递增。
  • @MichaelWalz,初始化一切是一个好习惯。那是恕我直言。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-02
  • 2011-11-13
  • 2021-10-15
  • 2020-02-16
相关资源
最近更新 更多