访问C向量中的书写冲突 [英] Accessing Writing Violation in C Vectors
问题描述
我试图将卡添加到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屋!