c - 内部有其他结构数组的结构的可用内存 - C

标签 c arrays memory-management struct free

我尝试使用动态数组,当我使用完它后,我尝试释放所使用的内存,但出现此错误。

free(): invalid next size (fast): 0x00652098 

这是结构变量的声明:

struct player {
int played_time;
int min_time;
int max_time;
int errors;
int color;
};

struct Players {
struct player *array;
size_t player_number;
size_t size;
};
typedef struct Players Player_list;

这是用于管理动态数组的方法:

void initArray(Player_list *list, size_t initialSize) {
  list->array = (struct player *) malloc(initialSize * sizeof(struct player));
  list->player_number = 0;
  list->size = initialSize;
}

void insertArray(Player_list *list, struct player element) {
  if (list->player_number == list->size) {
    list->size *= 2;
    list->array = (struct player *) realloc(list->array,
            list->size * sizeof(struct player));
  }
  list->array[list->player_number++] = element;
}

void freeArray(Player_list *list) {
  free(list->array);
  list->array = NULL;
  list->player_number = list->size = 0;
 }

int disqualified(Player_list *list, int errors) {
  int i = 0;
  for (i = 0; i < list->player_number; i++) {
    if (list->array[i].errors >= errors) {
        return 1;
    }
  }
  return 0;
  }

这是我在主要部分使用它的方式:

/**
 * When button is pressed 1 add an error to a random player
 */
void button_s_isr(void) {
    int index = rand() % (players.player_number);
    point_players->array[index].errors = point_players->array[index].errors      + 1;

}

      ... 

int main(void) {

      ...
// set up of GPIO
// get with scanf NUMBER_OF_PLAYERS and MAX_ERRORS values

int i;
for (i = 0; i < NUMBER_OF_PLAYERS; i++) {
    struct player player;
    player.color = PLAYER_COLORS[i];
    player.errors = 0;
    player.max_time = 0;
    player.min_time = 0;
    player.played_time = 0;
    insertArray(&players, player);
}

while (disqualified(&players, MAX_ERRORS) != 1) {
// wait
}
printf("\n  Se ha acabdo el juego: ");
freeArray(point_players);
return EXIT_SUCCESS;
}

我必须说我对 C 很陌生,如果很难理解,我很抱歉。 我想要做的是一个动态的结构列表(玩家),其中每个玩家都有自己的参数(played_time、min_time、max_time、errors、color)。在主要内容中,我想要一个可以控制每个玩家的参数的游戏。 感谢任何改进代码的帮助。

最佳答案

发布的代码:

  1. 无法编译
  2. 缺少 PLAYER_COLORS[i] 的定义,这是一个坏主意,因为玩家数量可能超过数组中的可用颜色。
  3. 错误地计算了realloc()所需的大小
  4. 无法检查 malloc()realloc() 等函数的返回值
  5. 包含令人困惑的变量和结构实例命名(即使对于 OP 也是如此)
  6. 缺少 num_jugadores 的定义
  7. 错误地尝试分配结构而不是复制结构
  8. 无法声明 struct Players 的实例

现在,更正了可以干净编译的代码:

警告:未经过充分测试

#include <stdio.h>
#include <stdlib.h>
#include <string.h>  // memcpy()

struct player
{
    int played_time;
    int min_time;
    int max_time;
    int errors;
    int color;
};

struct Players
{
    struct player *array;
    size_t player_number;
    size_t numPlayers;
};


//This are the method used to manage the dynamic array:

void freeArray(struct Players *pArray)
{
    free(pArray->array);
    pArray->array = NULL;
    pArray->player_number = pArray->numPlayers = 0;
}


void initArray( struct Players *pArray )
{
    if( NULL == (pArray->array = malloc(sizeof(struct player)) ) )
    { // then malloc failed
        freeArray( pArray );
        exit( EXIT_FAILURE );
    }

    // implied else, malloc successful

    pArray->player_number = 0;
    pArray->numPlayers = 1;
}


size_t sizeof_array(size_t size)
{
    return  size * sizeof(struct player);
}


void insertArray(struct Players *pArray, struct player *element)
{
    if (pArray->player_number == pArray->numPlayers)
    { // then currently allocated memory for array of players is full

        struct player *temp = NULL;
        if( NULL == (temp = realloc(pArray->array, sizeof_array(pArray->numPlayers)*2) ) )
        { // then, realloc failed
            freeArray( pArray );
            exit( EXIT_FAILURE );
        }

        // implied else, realloc successful

        pArray->numPlayers *= 2;
        pArray->array = temp;
    }

    memcpy( &(pArray->array[pArray->player_number]), element, sizeof( struct player ) );
    pArray->player_number++;
}

//and here is how i use it in the main method:

#define num_jugadores (20)

int main( void )
{
    int i;
    struct Players playerList;

    initArray(&playerList);

    for (i = 0; i < num_jugadores; i++)
    {
        struct player myPlayer;
        //player.color = PLAYER_COLORS[i];
        myPlayer.errors = 0;
        myPlayer.max_time = 0;
        myPlayer.min_time = 0;
        myPlayer.played_time = 0;
        insertArray(&playerList, &myPlayer);
    }


    //...

    freeArray(&playerList);
} // end function: main

关于c - 内部有其他结构数组的结构的可用内存 - C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37255407/

相关文章:

javascript - 原型(prototype)继承应该节省内存吧?

c++ - Linux,在fork()中与另一个程序共享一个缓冲区

c - 这个 typedef 怎么可能?

c - 使用 C 程序解析 MIDI 文件时出现问题

c++ - 字符串输出中的奇数字符C++

javascript - JavaScript 中的不可变对象(immutable对象)和集合

c++ - 为什么运行时环境不能决定应用 delete 或 delete[] 而不是程序员?

c++ - c/c++ | int * 除外,给定 int (返回指针??)

c - C 中#error 指令的输出

java - Android 中的大型公共(public)静态变量