C BlackJack编译但是分段错误

时间:2015-02-18 14:44:36

标签: c enums int

 #include <stdio.h>
 #include <stdlib.h>
 #include <time.h>
 #include <getopt.h>


typedef enum {Clubs, Diamonds, Hearts, Spades} suit_t;
typedef enum {Ace = 1, Two = 2, Three = 3, Four = 4, Five = 5, Six = 6, Seven = 7, Eight = 8, Nine = 9, Ten = 10, Jack = 10, Queen = 10, King = 10} face_t;

typedef struct card_t
{
        suit_t suit;
        face_t face;
} card;

typedef struct stack_t
{
    card_t deck[52];
    int size;
} stack_h;

void deck_init(stack_h *stack);
int main()
{
        stack_h stack;
        int entry;
        printf("Welcome to BlackJack by CodeHero\n");
        fflush ( stdout );
        printf("Enter 1 to Continue or press 2 to Exit\n");
        fflush ( stdout );
        scanf("%d", &entry);
        fflush ( stdin );

        switch ( entry )
        {
                case 1:

                        deck_init ( &stack );
                        deck_show ( &stack );
                        break;
                case 2:
                        printf("Exitting\n");
                        fflush ( stdout );
                        exit( 1 );
                        break;
        }
}

 void deck_init(stack_h *stack)
 {
        for (int i = Ace; i <= King; ++i)
        {
                for (int j = Clubs; j <= Spades; j++)
                {
                         stack->deck[stack->size].face = i;
                         stack->deck[stack->size].suit = j;
                         stack->size++;
                }
        }
}

void deck_show (stack_h *stack)
{
    int x, i ,j;
    printf("%d Cards in the deck. ", stack -> size);
    for (i = 0; i< 13; i++)
    {
      for(j=0; j < 4; j++)
      {
                printf("%d of %d\n", i, j);
       }
     }
}

我要做的是用卡片填充卡片然后显示所有卡片以确保卡片的填充正常,但是当我编译它时说我没有错误然后我去运行程序并且它一直到达堆栈的位置 - &gt; deck [stack-&gt; size] .face = i;然后分段错误。我真的不知道我需要做什么,因为我相信它应该有用。我已经尝试将它从指针改为常规样式stack.deck sorta技术,但是遇到了同样的问题。我认为它可能有一个问题,因为'enum'不是一个int而且它不想增加'enum'或类似的东西,也许反正。

2 个答案:

答案 0 :(得分:1)

stack结构未在任何地方分配,您尝试访问stack(及更高版本)中未分配的deck_init指针字段。您可能希望使用malloc动态分配它,或者静态地在stack_t中声明main变量,并使用指向它的指针。
更新(编辑后):stack->size也未在任何地方初始化。在deck_init中使用之前,应将其初始化为零。
Upd2:在deck_show中,您试图打印未初始化的变量i,j,并传递两个变量,而printf中只有一个格式修饰符。

答案 1 :(得分:0)

如果你想在main()中分配一个堆栈并将它的指针传递给你调用的函数,请使用:

stack_t stack; /* or stack_h if that's your new type name */

然后使用&stack将它的指针传递给一个带有堆栈指针的函数:

deck_init(&stack): /* for example */

您的stack_t *stack;声明仅创建一个指针,并且不会为该指针赋值。

如果这是一个大型结构,或者其中有很多结构,那么您可能希望在运行时使用malloc()来分配它们,但是我等待并在以后添加该复杂性 - 如果它甚至需要它。