嘿伙计们,我的程序中出现了一个非常特殊的分段错误。这个程序假设自动化纸牌游戏“战争”,到目前为止,我已经能够为两个玩家建立两个随机半甲板。这似乎表明enqueue工作正确。我也能够将所有值出列,它们以正确的顺序出现。但是如果我在main中取消注释每次程序段错误的整数声明。我不能为我的生活弄清楚简单的声明如何导致错误。请注意,这是我使用队列的唯一第二个任务。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
typedef struct node
{
int value;
int suit;
char*sname;
char*txt;
struct node *next;
} node;
int isempty(node *base){
if (base==NULL)
{return 1;}
else
return 0;
}
void printlist(node *base){
node *current=base;
if(base==NULL)
{
printf("The List is empty!\n");
return;
}
else
{
printf("Content: \n");
int count=0;
while(current!=NULL){
count++;
printf("%s \tof \t%s\n",current->txt,current->sname);
current=current->next;
}
printf("\nCount:%d\n",count);
}
}
char* valname(int n){
char *name;
switch(n)
{
case 0:name="two";break;
case 1:name="three";break;
case 2:name="four";break;
case 3:name="five";break;
case 4:name="six";break;
case 5:name="seven";break;
case 6:name="eight";break;
case 7:name="nine";break;
case 8:name="ten";break;
case 9:name="Jack";break;
case 10:name="Queen";break;
case 11:name="King";break;
case 12:name="Ace";break;
default:printf("Broken\n");exit(1);
}
return(name);
}
char* suitname(int n){
char *name;
switch(n){
case 0:name="Hearts";break;
case 1:name="Spades";break;
case 2:name="Clubs";break;
case 3:name="Diamonds";break;
default:printf("Broken\n");exit(1);
}
return(name);
}
void enqueue(node **base,int item){
node *nn,*current=*base;
nn=malloc(sizeof(node));
if(*base==NULL)
{
*base=nn;
}
else
{
while(current->next!=NULL){
current=current->next;
}
current->next=nn;
}
nn->value=item;
nn->txt=valname(item%13);
nn->sname=suitname(item/13);
nn->next=NULL;
}
int dequeue(node **base){
node *current=*base,*temp;
if (isempty(*base)==0){
int giveback=current->value;
if(current->next==NULL)
{
free(*base);
*base=NULL;
}
else
{
temp=current->next;
free(current);
*base=temp;
}
return giveback;
}else{return -1;}
}
void createdecks(node **deck1,node **deck2){
int i=0;
int thenumber=0;
int deck[52]={0};
for(i=0;i<26;i++){
thenumber=rand()%52;
if(deck[thenumber]==0){
//add to list
enqueue(deck1,thenumber);
deck[thenumber]=1;
}
else
{
i--;
}
}
for(i=0;i<26;i++){
thenumber=rand()%52;
if(deck[thenumber]==0){
//add to list
enqueue(deck2,thenumber);
deck[thenumber]=1;
}
else
{
i--;
}
}
}
int main(void){
node *d1,*d2,*warholder;
//int c1=0,c2=0; //THIS LINE!!!!!!!!!!!
srand(time(NULL));
createdecks(&d1,&d2);
//printlist(d1);
//printlist(d2);
int i=0;
for(i=0;i<26;i++)
printf("%d ",dequeue(&d1)); //return testing
printf("\n");
printlist(d1);
}
教授的榜样功能
char * namenum( int num)
{
char * name;
switch(num)
{
case 0:
name = "zero"; break;
case 1:
name = "one"; break;
case 2:
name = "two"; break;
case 3:
name = "three"; break;
case 4:
name = "four"; break;
case 5:
name = "five"; break;
case 6:
name = "six"; break;
case 7:
name = "seven"; break;
case 8:
name = "eight"; break;
case 9:
name = "nine"; break;
default:
printf("Invalid Number generated\n");
exit(1);
}
return name;
}
答案 0 :(得分:3)
我简要地查看了代码,它看起来像你有一个未初始化的变量问题。您在main()
:
node *d1,*d2,*warholder;
然后将其传递给createdecks()
,enqueue()
又调用enqueue()
。 d1
假定指针已初始化。
尝试初始化d2
中的main()
和node *d1,*d2,*warholder;
d1 = d2 = warholder = NULL;
:
{{1}}
答案 1 :(得分:-2)
这不是因为声明int。在使用之前,您没有多次为char * name分配内存。例如
char* valname(int n){
char *name;
在使用上面代码之后的名称
之前使用malloc()分配内存char* suitname(int n){
char *name;
再次犯同样的错误
如果你想避免这种情况,请使用数组而不是指针