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

C 声明Int变量会导致分段错误吗?,c,C,嘿,伙计们,我的程序中出现了一个非常奇怪的分段错误。这个程序被认为是自动化纸牌游戏“战争”,到目前为止,我已经能够建立两个随机的一半甲板两名球员。这似乎表明排队工作正常。我还能够将所有的值排出来,它们以正确的顺序出现。但是,在main中,如果我取消注释main中的整数声明,则每次程序都会出现segfults。我一辈子都搞不清楚简单的声明会导致多大的错误。请注意,这是我使用队列的第二个任务 #include <stdio.h> #include <stdlib.h> #in

嘿,伙计们,我的程序中出现了一个非常奇怪的分段错误。这个程序被认为是自动化纸牌游戏“战争”,到目前为止,我已经能够建立两个随机的一半甲板两名球员。这似乎表明排队工作正常。我还能够将所有的值排出来,它们以正确的顺序出现。但是,在main中,如果我取消注释main中的整数声明,则每次程序都会出现segfults。我一辈子都搞不清楚简单的声明会导致多大的错误。请注意,这是我使用队列的第二个任务

#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);
}

这不是因为声明int。在使用char*name之前,您多次没有为其分配内存。比如说

char* valname(int n){                                    
    char *name;     
在上述代码后面使用name之前,使用malloc()分配内存

char* suitname(int n){
    char *name;
又犯了同样的错误


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

我简要地查看了代码,在我看来,您有一个未初始化的变量问题。您可以在
main()
中声明:

然后将其传递给
createdeck()
,后者依次调用
enqueue()
enqueue()
假定指针已初始化

尝试在
main()中初始化
d1
d2


这绝对不是原因,因为如果
name
保持每个函数的本地性,那么就不会发生任何不好的事情。当它回到那里时,问题就出现了。哦,真的吗????当char*没有内存时,如何将值分配给它???我将是madIt,因为你是在分配指针,而不是它的值。没错!但一旦你得到了它,你将成为编程之神。我想你可能是穆斯林,所以我希望说上帝不是冒犯,我父亲也是穆斯林,我只是不理解上帝理论,所以我不是。函数中的
name
指向存储字符串文字的位置,并且该位置有效。位置是函数的堆栈帧,因此当函数返回时,它将与函数解除分配。当它还没有被分配时,它是如何被释放的???不是在这种情况下,事实证明我错了,当你使用
char
数组时,这是真的,但是字符串文本有静态存储。在main中初始化你的指针,看看它是否消失。我猜堆栈中有垃圾导致指针在第一次插入时非空,尽管它们没有指向任何分配的内存。编辑并声明零整数会影响指针的初始状态,这就是为什么程序运行时设置了零整数。如果您有Valgrind,请尝试在下面运行它-它会立即检测到问题。@Tyler请不要编辑问题,说“已回答”或“已编辑”之类的话这让第一次看到这个问题的人感到困惑。取而代之的是,接受一个发布的答案,这就是你所需要做的。我想我在enqueue函数中解决了这个问题。不@Tyler,除非你指定一个值,否则函数中声明的变量不能保证用一个值初始化。您可以检查base是否为null,这很好,但您依赖于base在最初声明的位置(在main中)已初始化为null。如果堆栈上碰巧有东西,base可能有一个非空值,即使你没有给它赋值。太棒了,谢谢你!这把一切都搞定了!
char* suitname(int n){
    char *name;
node *d1,*d2,*warholder;
node *d1,*d2,*warholder;
d1 = d2 = warholder = NULL;