访问C向量中的书写冲突 [英] Accessing Writing Violation in C Vectors

查看:72
本文介绍了访问C向量中的书写冲突的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图将卡添加到Vect-> Items卡阵列中,但是在Items阵列地址的添加中遇到访问写入冲突。向量的初始化有问题吗?访问写入冲突发生在初始化向量的地址处,但是我不明白为什么如果只是初始化它就会出错。

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


推荐答案

就像人们在评论中说的那样,您所使用的代码在 if(!newStore)内进行操作是多余的,因为自 realloc()失败后, malloc() 也可能会失败。而且主要是您忘记了使用 newStore 更新 vect->商品。因此,您应该得到这样的结果:

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

这篇关于访问C向量中的书写冲突的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆