0

我得到了大部分工作,包括随机化和洗牌,但是在分配正确的面/西装值时,我做不到正确。另外,我正在“中止(核心转储)”,可能是因为我几乎不知道我在做什么malloc(如果有的话,在这种情况下)。

typedef struct cards {
    char suits[4][9], faces[13][6];
    int suit, face, card;
} cards;

const int SHOE_SIZE = DECK_SIZE * numberOfDecks; // user given input, please disregard

cards shoe[SHOE_SIZE];
init_struct(&shoe);

cards *shoe_p = malloc(sizeof(cards) + 1000 * sizeof(int));
shoe_p = shoe;

int i;
for (i = 0; i < SHOE_SIZE; i++) {
    shoe[i].card = i;
    shoe[i].suit = shoe[i].card % 4;  // maybe one of these should be % and another /
    shoe[i].face = shoe[i].card % 13; // but when I try that, I get strings like "ace of ace"
    printf("card #%d = %s of %s\n", i+1, shoe->faces[shoe[i].face], shoe->suits[shoe[i].suit]);
}

free(shoe);

我遗漏的代码部分无疑是所描述问题的根源。如果我应该提供更多信息,请告诉我!

编辑:附加问题;我是否以适当的方式访问我的结构成员“面孔”和“西装”?对我来说似乎是这样,但话又说回来,我看不出还有什么会导致我的字符串输出奇怪的(参见代码中的注释)。

另外,我可以将 SHOE_SIZE 作为我的数组的成员,并以相同的方式(shoe->variable)访问它,而不必先通过变量 SHOE_SIZE 分配它吗?

4

2 回答 2

4
cards *shoe_p = malloc(sizeof(cards) + 1000 * sizeof(int));
shoe_p = shoe;

在这里,您正在泄漏内存:shoe_p指向一些未分配的内存,但现在您丢失了该指针,因为您将它重新分配给指向shoe. 我认为你根本不需要这两行。

free(shoe);

也是错误的:你没有创建shoeusing malloc(),所以你不需要也不能这样做free()

可能是因为我几乎不知道我在用 malloc 做什么

没错,但别担心:你可以通过阅读这篇文章来提高你的知识。

于 2013-05-12T16:10:26.463 回答
1
const int SHOE_SIZE = DECK_SIZE * numberOfDecks;
cards shoe[SHOE_SIZE];

这些行根本没有意义。第一行在运行时计算(即使作为用户给定的输入)一个常数。所以在编译它的值时还不知道。但在下一行中,您将使用这个未知数在编译时分配非动态内存。因此,如果您想正确执行此操作,请将第二行扔掉并使用malloc()(正如您在下面的几行中所做的那样)。此外,您正在使用该shoe_p = shoe;行丢弃此内存。解决这个问题的正确方法是:

...
const int SHOE_SIZE = DECK_SIZE * numberOfDecks;
cards *shoe = malloc(sizeof(cards) + 1000 * sizeof(int));
init_struct(&shoe);

int i;
...

并且因为您正在使用它,所以它在 and 处malloc()是绝对正确的。free()

于 2013-05-12T16:26:39.967 回答