c - 访问 C 向量中的写入冲突
问题描述
我正在尝试将一张卡片添加到我的 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);
主程序
Vector Deck;
VectorInit(&Deck, 52);
Card test;
test.face = (Face)2;
test.suit = (Suits)1;
Add(test, &Deck);
解决方案
就像人们在评论中所说的那样,你在里面做的代码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;
}