声明Int变量会导致分段错误吗?

时间:2015-03-31 18:40:29

标签: c

嘿伙计们,我的程序中出现了一个非常特殊的分段错误。这个程序假设自动化纸牌游戏“战争”,到目前为止,我已经能够为两个玩家建立两个随机半甲板。这似乎表明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;
}

2 个答案:

答案 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;

再次犯同样的错误

如果你想避免这种情况,请使用数组而不是指针