纸牌游戏问题 - 记忆和奇数值

时间:2013-05-12 16:07:03

标签: c pointers segmentation-fault malloc

我得到了大部分工作,包括随机化和改组,但在分配正确的面部/套装值时,我无法做到正确。另外,我得到'Aborted(core dumped)',可能是因为我很少知道我正在用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-&gt;变量),而不必先通过变量SHOE_SIZE分配它?

2 个答案:

答案 0 :(得分:4)

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

这里你正在泄漏内存:shoe_p指向一些mallocated内存,但现在你松开了指针,因为你将它重新分配给指向shoe的第一个元素的指针。我认为你根本不需要这两行。

free(shoe);

也是错误的:您没有使用shoe创建malloc(),因此您不需要也不能free()

  

可能是因为我很少知道我在做什么用malloc

是的,但不要担心:您可以通过阅读this来提高您的知识。

答案 1 :(得分: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;
...

因为你正在使用malloc(),所以在{和{> p> free()绝对是正确的。