Доступ к нарушениям записи в векторах C - PullRequest
0 голосов
/ 15 декабря 2018

Я пытаюсь добавить карту в свой массив карт Vect-> Items, но получаю нарушение записи доступа в моем добавлении по адресу массива Items.Что-то не так с инициализацией вектора?Нарушение записи доступа происходит по адресу инициализированного вектора, но я не понимаю, почему это будет ошибкой, если он просто инициализируется.

void VectorInit(Vector * vect, int capacity)
{
    vect->size = 0;             //initialize the size to 0 (no elements)
    vect->capacity = capacity;  //initialize capacity to 10, can grow later


    vect->Items = (Card *)malloc(sizeof(Card)* vect->capacity); //alloc mem space for Items array = size of an int * capacity alloted
}

void Grow(Vector * vect)
{
    int i;

    if (vect->capacity < 0) //if the capacity ever reaches 0 or below, reset it to 10
        vect->capacity = 10;
    else
        vect->capacity *= 2; // 'grow' the capacity by doubling it

    Card *newStore = (Card *)realloc(vect->Items, (vect->capacity) * sizeof(Card)); //realloc size for newStore

    if (!newStore)
    {
        newStore = (Card*)malloc(vect->Items, (vect->capacity * sizeof(Card)));

        for (i = 0; i < vect->size; ++i)
        {
            newStore[i] = vect->Items[i]; //copy original values into larger int array
        }

        free(vect->Items); //free space
        vect->Items = newStore; //point items int array to new int ptr
        newStore = 0; //best practice
    }

}
void Add(Card card, Vector * vect)
{
    if (vect->size == vect->capacity) //if the num of elements = capacity, the array is full - Grow it
        Grow(vect);
    vect->Items[vect->size] = card;        //add a provided index and value for insertion in Items array
    ++vect->size;//increment the size so the pointer points to the next available spot

}

.h

typedef enum {Clubs,Diamonds,Hearts,Spades} Suits;
typedef enum{Deuce = 2,Three,Four,Five,Six,Seven,Eight,Nine,Ten,Jack,Queen,King,Ace} Face;

typedef struct card
{
    Suits suit;
    Face face;

} Card;

typedef struct vector
{
    Card * Items; //pointer to array of cards
    int size; //current num of elements
    int capacity; //max num of elements

}Vector;


void VectorInit(Vector * vect, int capacity);
void Grow(Vector * vect);
void Add(Card card, Vector * vect);

main.c

Vector Deck;

VectorInit(&Deck, 52);

Card test;

test.face = (Face)2;
test.suit = (Suits)1;

Add(test, &Deck);

1 Ответ

0 голосов
/ 15 декабря 2018

Как говорили люди в комментариях, код, который вы делаете внутри if(!newStore), является избыточным, потому что, поскольку realloc() fail malloc(), возможно, тоже потерпит неудачу.И в основном вы забываете обновить vect->Items с newStore.Поэтому у вас должно получиться что-то вроде этого:

void VectorInit(Vector *vect, int capacity) {
    vect->size = 0;
    vect->capacity = capacity;
    vect->Items = malloc(sizeof(Card) * capacity);
}

void Grow(Vector *vect) {
    if (vect->capacity < 0) vect->capacity = 10;
    else vect->capacity *= 2;

    Card *newStore = realloc(vect->Items, vect->capacity * sizeof(Card));
    vect->Items = newStore;
}

void Add(Card card, Vector *vect) {
    if (vect->size == vect->capacity) Grow(vect);
    vect->Items[vect->size++] = card;
} 
...