C 引用指针时遇到segfault
我正在学习一门C编程入门课程,我试图理解指针,以及它们到底是如何工作的。我试图通过C 引用指针时遇到segfault,c,function,pointers,C,Function,Pointers,我正在学习一门C编程入门课程,我试图理解指针,以及它们到底是如何工作的。我试图通过gameRuntime()传递变量计数器,但在while循环之后,计数器未返回。因此,我选择使用指针。现在我的处境比开始时更糟 代码: #包括 #包括 #包括 int*游戏运行时(int*计数器) { srand(时间(空)); int random=rand()%100+1; printf(“>%d”); scanf(“%d”,猜测(&guess); 如果((猜测>100)| |(猜测”; scanf(“%c”,
gameRuntime()传递变量计数器代码>,但在while循环之后,计数器
未返回。因此,我选择使用指针。现在我的处境比开始时更糟
代码:
#包括
#包括
#包括
int*游戏运行时(int*计数器)
{
srand(时间(空));
int random=rand()%100+1;
printf(“>%d”);
scanf(“%d”,猜测(&guess);
如果((猜测>100)| |(猜测<1))
{
printf(“请选择一个介于1和100之间的数字\n”);
}
else if(猜测<随机)
{
printf(“我的号码大于%d!\n”,猜测);
本地_计数器++;
printf(“%d个猜测左!\n”,(11-本地_计数器));
}
else if(猜测>随机)
{
printf(“我的号码小于%d!\n”,猜测);
本地_计数器++;
printf(“%d个猜测左!\n”,(11-本地_计数器));
}
else if(猜测==随机)
{
printf(“你猜对了!我的号码是%d!\n”,随机);
printf(“您仅用%d个猜测就找到了它!\n”,本地\u计数器);
}
}
(*计数器)=本地_计数器;
返回计数器;
}
int main()
{
退出;
整数计数器;
int随机;
printf(“欢迎参加数字猜谜游戏!\n”);
printf(“我选择了一个介于1和100之间的数字,您只有10次机会猜到它!\n\n”);
printf(“继续?[Y\\N]\N\N>”;
scanf(“%c”,&quit);
如果((quit='n')| |(quit='n'))
{
printf(“退出…”);
返回0;
}
其他的
{
printf(“\n=*=+=*=+=*=+=*=+=*=+=*=+=+=*=*=*=+=*=+=*=+=+=*=+=+=*=+=+=+*\n”);
printf(“~~~准备好了吗?~~\n”);
printf(“=*=+=*=+=*=+=+=*=+=+=*=+==+=+=*=+=+=*=+=+=*=+=+=+=+=*=+=+=*=+=+=*\n”);
printf(“\n”);
printf(“\n----------------------”;
printf(“\nOk,我已经决定!\n”);
printf(“--------------------------\n”);
}
游戏运行时间(计数器);
printf(“\n---%d---\n”,计数器);
连续字符集;
而((continueGame!='N')| |(continueGame!='N'))
{
printf(“\n---%d---\n”,计数器);
如果(计数器>=10)
{
printf(“对不起!你猜了10下就找不到我的号码!\n”);
printf(“我的号码是%d\n”,随机);
printf(“可能下次!\n”);
printf(“\N再次尝试?[Y\\N]\N”);
scanf(“%c”和continueGame);
if((continueGame=='Y')| |(continueGame=='Y'))
{
游戏运行时间(计数器);
}
其他的
{
printf(“谢谢玩!回头见!”);
返回0;
}
}
其他的
{
printf(“再次播放?[Y\\N]\N>”;
scanf(“%c”和continueGame);
if((continueGame=='Y')| |(continueGame=='Y'))
{
游戏运行时间(计数器);
}
其他的
{
printf(“\n欢迎玩!待会儿见!”);
返回0;
}
}
}
}
如果您有任何帮助,我们将不胜感激
gameRuntime(counter);
到
您正在传递计数器的值
,然后使用它,就像它是某个对象的地址一样(您取消了对指针的引用)。它确实可以编译,因为指针和int
s在c中是可互换的,但这并不意味着行为已经定义。但是,它应该生成一个关于指向int
转换的指针的警告。您还可以将所有警告转换为错误,以防止在出现警告时编译
警告在非常罕见的情况下可以被忽略,因此根据经验,让编译器尽可能地发出警告,如果可能,让它将警告视为错误
通过应用建议的修复,您可以传递计数器的地址,该地址是内存中保存计数器位置的指针,因此您可以通过取消引用指针来影响该位置的值。更改
gameRuntime(counter);
到
您正在传递计数器的值
,然后使用它,就像它是某个对象的地址一样(您取消了对指针的引用)。它确实可以编译,因为指针和int
s在c中是可互换的,但这并不意味着行为已经定义。但是,它应该生成一个关于指向int
转换的指针的警告。您还可以将所有警告转换为错误,以防止在出现警告时编译
警告在非常罕见的情况下可以被忽略,因此根据经验,让编译器尽可能地发出警告,如果可能,让它将警告视为错误
通过应用建议的修复,您可以传递计数器的地址,该地址是内存中保存计数器位置的指针,因此您可以通过取消引用指针来影响该位置的值。游戏运行时(计数器)代码>->游戏运行时(&counter)代码>投票关闭是一个输入错误。如果你的编译器没有告诉你到底是什么问题,那就换一个新的编译器吧!我的警告直接指向问题。避免类似错误的一个好方法是启用所有编译器警告,并在运行代码之前修复它们。除了编译器错误,代码中还有逻辑错误。撇开一切不谈,代码在没有指针的情况下无法按预期工作(“我试图通过gameRuntime()传递变量计数器…”)的原因是您运行了函数gameRuntime(计数器),但没有保存/分配返回值(已处理的新
gameRuntime(&counter);