【发布时间】:2019-04-24 10:11:53
【问题描述】:
我正在使用 C 实现纸牌游戏,这是我的代码:
甲板.h:
#ifndef DECK_H
#define DECK_H
#define S_NUM 4
#define V_NUM 12
#define S_MAXLEN 9
#define V_MAXLEN 6
#define OFLEN 5
typedef char deck_t
[S_NUM * V_NUM]
[S_MAXLEN + V_MAXLEN + OFLEN];
typedef struct {
deck_t *hand;
deck_t *remaining_cards;
} dealed_deck_t;
deck_t *new_deck(void);
void print_deck(const deck_t *);
dealed_deck_t deal(const deck_t *, int);
void free_deck(const deck_t *);
static void deckcpy(const deck_t *const, deck_t *, int);
#endif
deck.c:
#include "deck.h"
#include <assert.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
deck_t *new_deck() {
int i, j, k;
deck_t *cards = calloc(1, sizeof(deck_t));
char suits[S_NUM][S_MAXLEN] = {
"Spades", "Diamonds",
"Hearts", "Clubs"
};
char values[V_NUM][V_MAXLEN] = {
"Ace", "Two", "Three",
"Four", "Five", "Six",
"Seven", "Eight", "Nine",
"Jack", "Queen", "King"
};
for (i = 0; i < S_NUM * V_NUM; ++i) {
memset(*cards[i], 0, strlen(*cards[i]));
}
for (i = 0, j = 0; i < S_NUM; ++i) {
for (k = 0; k < V_NUM; ++k, ++j) {
strcat(*cards[j], values[k]);
strcat(*cards[j], " of ");
strcat(*cards[j], suits[i]);
}
}
return cards;
}
void print_deck(const deck_t *deck) {
for (int i = 0; i < S_NUM * V_NUM && strlen(*deck[i]); ++i) {
printf("%s\n", *deck[i]);
}
}
dealed_deck_t deal(const deck_t *deck, int handsize) {
int i, j;
dealed_deck_t dealed_deck;
dealed_deck.hand = calloc(1, sizeof(deck_t));
dealed_deck.remaining_cards = calloc(1, sizeof(deck_t));
// print_deck(deck);
return dealed_deck;
}
void free_deck(const deck_t *deck) {
free((void *)deck);
}
static void deckcpy(const deck_t *const deck, deck_t *dest, int handsize) {
for (int i = 0; i < handsize; ++i) {
char temp[strlen(*deck[i])];
for (int j = 0; j < strlen(*deck[i]); ++j) {
temp[j] = (*deck[i])[j];
temp[j] = '\0';
}
for (int j = 0; j < strlen(temp); ++j) {
(*dest[i])[j] = temp[j];
(*dest[i])[j] = '\0';
}
}
}
main.c:
#include "deck.h"
int main() {
deck_t *cards = new_deck();
deck_t *hand = deal(cards, 6).hand;
// print_deck(cards);
free_deck(cards);
return 0;
}
问题是deal 函数中的deck.c。
当我为dealed_deck.hand 和dealed_deck.remaining_cards 分配内存时,参数deck 指向的数据受到影响和改变,所以当我评论这两行时:
dealed_deck.hand = calloc(1, sizeof(deck_t));和dealed_deck.remaining_cards = calloc(1, sizeof(deck_t));,数据是一样的,我取消注释的时候数据有点变化。
我在这里使用calloc,因为当我使用malloc 时,dealed_deck.hand 和dealed_deck.remaining_cards 指向的数据与deck 指向的数据相同,但是当我使用calloc 时,它们是随心所欲。
我需要一种分配内存的方法,而不会弄乱我之前分配的内存和数据,该怎么做?
我正在使用 MacOS 和 gcc 进行编译。 谢谢。
【问题讨论】:
-
鉴于
cards是deck_t *,您认为cards[i]是什么?您可能应该打开 all 编译器警告... -
我根本没有编译器警告,我是这样编译的:
gcc main.c deck.c -
当我使用 -Wall 编译当前代码时,我得到的只是未使用的变量和未使用的函数
-
整体方法已经完全错误。一张牌不应首先定义为两个字符串(例如“Ace”、“Hearts”)。扔掉那些代码,重新考虑并从头开始。
-
我接受这一点,但我对这里的情况真的很感兴趣,因为书籍或讲师从未提及
malloc或calloc可能会如此混乱,并影响之前分配的数据(如果这真的是我的结论)。
标签: c