我在C中有一个纸牌游戏(我必须在C,类项目中制作)。我创建了一种方法,用于将Structs从一个动态数组移动到另一个动态数组。不幸的是,该方法最初工作,但后来当我在程序中调用它时,它开始抛出malloc()错误。 Deck
是包含int size
和动态分配Card *deck
的结构,Card
是用于保存单张卡的结构。有什么我缺少的,或者必须以另一种方式定义?
void moveCard(Deck *src, Deck *dest, int n){
Card *tmpCards = NULL;
Card tmp = (*src).deck[n]; // get card to be copied
int newSize = dest->size + 1; //increase dest size by 1
tmpCards = (Card *) malloc(sizeof(Card) * newSize); // allocate new memory area
memmove(&(tmpCards[0]), &(dest->deck[0]), sizeof(Card) * (newSize - 1));
// copy all the cards from old memory area to new area
dest->deck = tmpCards; // reassign old pointer to new memory area
dest->size = newSize; // reevaluate size
dest->deck[newSize - 1] = tmp; // copy card to end of new area
tmpCards = NULL; // empty out pointer (no functionality, just for easier reading)
newSize = src->size; // reevaluate newSize
tmpCards = (Card *) malloc(sizeof(Card) * (newSize - 1));
// allocate smaller mem area by 1
memmove(&(tmpCards[0]),&(src->deck[0]), sizeof(Card) * (n));
// copy all cards up to the n-th point
memmove(&(tmpCards[n]),&(src->deck[n+1]), sizeof(Card) * (newSize - n));
// copy all cards from the n+1 -th point
src->size = newSize -1; // reevaluate size
src->deck = tmpCards; // reassign pointer
// since all input parameters were pointers, no return is necessary
}
编辑:,因为我不会释放记忆这一事实。原始代码中包含2个免费命令(free(dest->deck)
和free(src->deck)
)。但只有其中一个有效。另一个因为一些奇怪的原因再次创建了内存损坏,所以我发现它更好,而不是把它们放到这个例子中。
答案 0 :(得分:2)
我认为你的内存耗尽,因为你没有释放任何内存。你只是在分配新的内存。
void moveCard(Deck *src, Deck *dest, int n){
Card *tmpCards = NULL;
Card tmp = (*src).deck[n]; // get card to be copied
int newSize = dest->size + 1; //increase dest size by 1
tmpCards = (Card *) malloc(sizeof(Card) * newSize); // allocate new memory area
memmove(&(tmpCards[0]), &(dest->deck[0]), sizeof(Card) * (newSize - 1));
// copy all the cards from old memory area to new area
// **** CORRECTION ****
// Free previously allocated memory for dest->deck
free(dest->deck);
dest->deck = tmpCards; // reassign old pointer to new memory area
dest->size = newSize; // reevaluate size
dest->deck[newSize - 1] = tmp; // copy card to end of new area
tmpCards = NULL; // empty out pointer (no functionality, just for easier reading)
newSize = src->size; // reevaluate newSize
tmpCards = (Card *) malloc(sizeof(Card) * (newSize - 1));
// allocate smaller mem area by 1
memmove(&(tmpCards[0]),&(src->deck[0]), sizeof(Card) * (n));
// copy all cards up to the n-th point
memmove(&(tmpCards[n]),&(src->deck[n+1]), sizeof(Card) * (newSize - n));
// copy all cards from the n+1 -th point
src->size = newSize -1; // reevaluate size
// **** CORRECTION ****
// Free previously allocated memory for src->deck
free(src->deck);
src->deck = tmpCards; // reassign pointer
// since all input parameters were pointers, no return is necessary
}
PS 您应该使用memcpy
代替memmove
。如果源和目标重叠,memmove
是正确的函数。如果源和目标不重叠,memcpy
是正确的函数。