C.exe“;“停止工作”;错误

C.exe“;“停止工作”;错误,c,runtime-error,exe,C,Runtime Error,Exe,这个C程序编译得很好,但是当我运行它时,在它请求第一次输入后,我收到一个windows错误,说“hw.exe已停止工作” #包括 #包括 内部主(空) { 内瓦拉、瓦布、瓦克; 双重结果; printf(“输入三角形的第一条边”); scanf(“%d”,valA); printf(“输入三角形的第二条边”); scanf(“%d”,valB); valC=(valA*valA)+(valB*valB); 结果=sqrt(valC); printf(“%d的平方根是:%f\n”,valC,res

这个C程序编译得很好,但是当我运行它时,在它请求第一次输入后,我收到一个windows错误,说“hw.exe已停止工作”

#包括
#包括
内部主(空)
{
内瓦拉、瓦布、瓦克;
双重结果;
printf(“输入三角形的第一条边”);
scanf(“%d”,valA);
printf(“输入三角形的第二条边”);
scanf(“%d”,valB);
valC=(valA*valA)+(valB*valB);
结果=sqrt(valC);
printf(“%d的平方根是:%f\n”,valC,result);
返回0;
}

我对C非常陌生,所以我肯定我错过了一些非常简单的东西。感谢您的帮助。谢谢

您需要将地址传递给
scanf

scanf("%d", &valA);
您必须传递
valA
地址,然后
scanf
将在该地址写入变量。您的代码传递
valA


同样,您对另一个调用
scanf

进行相同的更改,您需要将地址传递给
scanf

scanf("%d", &valA);
您必须传递
valA
地址,然后
scanf
将在该地址写入变量。您的代码传递
valA


同样地,您对另一个调用
scanf

进行相同的更改,在使用
scanf
时,您必须使用
&
(的地址)操作符。比如说,

scanf("%d", valA);
应该是

scanf("%d", &valA);
这是因为
scanf
希望参数是指向从输入读取的变量的指针,而不是变量本身。指针是变量在内存中的位置
scanf
使用此信息更改所提供参数的值


因此,当您将值传递给scanf时,它会将其用作指针,而不管您实际传递的是什么,因为C是相对不安全的类型。当您在
scanf
需要指针的情况下使用单位化变量时,
scanf
尝试写入内存中的随机位置,导致未定义的行为。

使用
scanf
时,必须使用
(地址)运算符。比如说,

scanf("%d", valA);
应该是

scanf("%d", &valA);
这是因为
scanf
希望参数是指向从输入读取的变量的指针,而不是变量本身。指针是变量在内存中的位置
scanf
使用此信息更改所提供参数的值


因此,当您将值传递给scanf
时,它会将其用作指针,而不管您实际传递的是什么,因为C是相对不安全的类型。当您使用一个单位化变量时,
scanf
需要一个指针,
scanf
尝试写入内存中的随机位置,导致未定义的行为。

打开comiler警告打开comiler警告后续问题:当我运行它时,它允许输入两个输入(感谢您的帮助)但在我有机会读取输出之前,程序就完成并关闭了。有没有办法改变这一点?只需将
getchar()
添加到代码末尾,就在
return
语句之前。这将阻止程序关闭,直到您按enter键。非常感谢!你帮了我大忙。再次感谢!一个后续问题:当我运行它时,它允许输入两个输入(感谢您的帮助),但是程序在我有机会读取输出之前完成并关闭。有没有办法改变这一点?只需将
getchar()
添加到代码末尾,就在
return
语句之前。这将阻止程序关闭,直到您按enter键。非常感谢!你帮了我大忙。再次感谢!