Accessing Writing Violation in C Vectors

﹥>﹥吖頭↗ 提交于 2020-03-05 06:34:44

问题


I'm trying to add a card into my Vect->Items card array, but I'm getting an access writing violation in my add at the Items array address. Is there something wrong with the initialization of the vector? The access writing violation occurs at the address of initialized vector, but I don't understand why it would be an error if it's just initializing.

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:


Like people said in the comments the code you're doing inside if(!newStore) is redudant because since realloc() failed malloc() will possible fail too. And mainly you're forgeting to update vect->Items with the newStore. Therefore you should end up with something like this:

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;
} 


来源:https://stackoverflow.com/questions/53788067/accessing-writing-violation-in-c-vectors

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!