Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 引用指针时遇到segfault_C_Function_Pointers - Fatal编程技术网

C 引用指针时遇到segfault

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”,

我正在学习一门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);