C BlackJack 编译但分段错误
C BlackJack compiles but Segmentation Faults
#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);
}
}
}
我想做的是用纸牌填充一副牌,然后显示所有纸牌以确保纸牌的填充工作正常,但是当我编译时它说我没有错误然后我去 运行 程序,它一直到它说的地方 stack->deck[stack->size].face = i;然后是分段错误。我真的不知道我需要用这个做什么,因为我相信它应该有效。我曾尝试将其从指针更改为常规样式 stack.deck sorta 技术,但遇到了同样的问题。我认为它可能有一个问题,因为 'enum' 不是一个整数,它不想增加一个 'enum' 或类似的东西,也许无论如何。
stack
结构未在任何地方分配,您正在尝试访问 deck_init
(及更高版本)中未分配的 stack
指针字段。您可能希望使用 malloc
动态分配它或在 main
中静态声明 stack_t
变量,并使用指向它的指针。
更新(编辑后): stack->size
也没有在任何地方初始化。在 deck_init
中使用之前应将其初始化为零。
Upd2:在 deck_show
中,您试图打印未初始化的变量 i,j
,并且还传递了两个变量,而在 printf
.
中只有一个格式修饰符
如果您想在 main()
中分配一个堆栈并将它的指针传递给您调用的函数,请使用:
stack_t stack; /* or stack_h if that's your new type name */
然后使用&stack
将它的指针传递给一个接受堆栈指针的函数:
deck_init(&stack): /* for example */
您的 stack_t *stack;
声明只创建了一个指针,并没有给该指针赋值。
如果这是一个大型结构,或者如果其中有很多,那么您可能希望使用 malloc()
在 运行 时间分配它们,但我会等待并稍后添加复杂性——如果甚至需要的话。
#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);
}
}
}
我想做的是用纸牌填充一副牌,然后显示所有纸牌以确保纸牌的填充工作正常,但是当我编译时它说我没有错误然后我去 运行 程序,它一直到它说的地方 stack->deck[stack->size].face = i;然后是分段错误。我真的不知道我需要用这个做什么,因为我相信它应该有效。我曾尝试将其从指针更改为常规样式 stack.deck sorta 技术,但遇到了同样的问题。我认为它可能有一个问题,因为 'enum' 不是一个整数,它不想增加一个 'enum' 或类似的东西,也许无论如何。
stack
结构未在任何地方分配,您正在尝试访问 deck_init
(及更高版本)中未分配的 stack
指针字段。您可能希望使用 malloc
动态分配它或在 main
中静态声明 stack_t
变量,并使用指向它的指针。
更新(编辑后): stack->size
也没有在任何地方初始化。在 deck_init
中使用之前应将其初始化为零。
Upd2:在 deck_show
中,您试图打印未初始化的变量 i,j
,并且还传递了两个变量,而在 printf
.
如果您想在 main()
中分配一个堆栈并将它的指针传递给您调用的函数,请使用:
stack_t stack; /* or stack_h if that's your new type name */
然后使用&stack
将它的指针传递给一个接受堆栈指针的函数:
deck_init(&stack): /* for example */
您的 stack_t *stack;
声明只创建了一个指针,并没有给该指针赋值。
如果这是一个大型结构,或者如果其中有很多,那么您可能希望使用 malloc()
在 运行 时间分配它们,但我会等待并稍后添加复杂性——如果甚至需要的话。