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