程序崩溃与0xC0000005

时间:2017-02-17 03:49:00

标签: c

我一直在尝试运行我的代码,但始终以错误代码0xC0000005结束

#include <stdio.h>
#include <math.h>

void calculate_resistance(char metal, int length, int diameter, float   resistivity);

int main()
{
   int length, diameter;
   float resistivity;
   char metal;
   printf("Enter the name of the metal: ");
   scanf("%s", &metal);
   printf("Enter the resistivity: ");
   scanf("%f", &resistivity);
   printf("Enter the length: ");
   scanf("%d", &length);
   printf("Enter the diameter: ");
   scanf("%d", &diameter);
   calculate_resistance(metal, length, diameter, resistivity);
   return 0;
}

void calculate_resistance(char metal, int length, int diameter, float resistivity)
{
   float radius = diameter / 2;
   float area_of_wire = (M_PI) * pow(radius,2) * length;
   float resistance = resistivity * length / area_of_wire;
   printf("Resistivity of %s is %f", metal, resistance);
}

我发现如果我注释掉&#34; printf(&#34;%s的电阻率是%f&#34;,金属,电阻);&#34;或者在最后一次扫描后的任何printf,它都不会崩溃,错误代码为0xC0000005

3 个答案:

答案 0 :(得分:2)

3 2 1

声明char metal; 。它只能存储一个字符。您想要存储一组字符,即字符串。所以使用

char

之后,请忽略char metal[50]; /* Can store a max of 49 chars +1 for the \0 */

&

因为数组的名称已经转换为指向其第一个元素的指针。为了增加安全性,可以在格式说明符中阻止长度修饰符,表示最大字符数减1(为NUL终止符保留1个空格):

scanf("%s", &metal);

此外,您应该提供更多错误检查,并通过查看其返回值来检查所有scanf("%49s", metal); 是否成功。 不要忘记在函数声明和定义中将scanf更改为char metalchar metal[],因为您没有传递单个字符,而是传递数组(实际上,指向它的指针)第一个元素因为数组“衰变”。

答案 1 :(得分:0)

char metal;
printf("Enter the name of the metal: ");
scanf("%s", &metal);

此代码调用未定义的行为。您正尝试在一个char变量中存储字符序列。您应该使用%c格式说明符或字符数组。

答案 2 :(得分:0)

可变金属是炭。这只包含1个字符。你需要持有一个字符数组。

char metal[100];

当然,100可能不适合您的情况,但对char%s使用scanfprintf会导致问题。