我试图将卡添加到我的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);
答案 0 :(得分:0)
就像人们在评论中说的那样,您在if(!newStore)
内部执行的代码是多余的,因为自realloc()
失败以来,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;
}