c中的执行错误:“分段错误(核心转储)”

时间:2016-03-13 20:12:59

标签: c input segmentation-fault scanf

我只是C语言程序员的初学者。尝试做一个基本程序,当我执行并引入任何一个数字时会出现此错误。

#include <stdio.h>
int main ()
{
  float a;
  scanf("%f",a);
  printf("%f\n",a);
  return (0);
} 

3 个答案:

答案 0 :(得分:4)

记住scanf是一个函数,你遇到的问题是直接传递变量。通过这样做,程序将收到变量的副本,并且将无法修改main中包含的变量。 Scanf使用指向数据类型的指针,这就是你需要传递指针的原因。 这应该解决它:

  

的scanf(&#34;%F&#34;,&安培;一个);

注意:使用&amp;您正在使用该变量的内存位置(与指针相同)。

你得到一个seg错误的原因是内部scanf一旦该函数获取用户输入它将做的事情

*a = user_input;//suppose the user_input was a float(already converted from a string) 

如果直接传递变量,它将尝试推断包含的值。

答案 1 :(得分:2)

scanf期望变量a地址;您实际传递的是变量a内容,它是a) indeterminate 1 ,以及b)非常可能不是有效的 2 地址。

您需要使用一元&运算符来获取a地址

scanf( "%f", &a );

此规则的例外是当您读取字符串并将其存储到char数组时;数组是特殊的,在大多数情况下,数组表达式被视为,就像它是指向数组的第一个元素的指针一样,因此在读取文本字符串时,您将执行以下操作:< / p>

char str[N]; // for some size N
scanf ("%s", str ); // no & for array parameters

<小时/> 1。除非它在文件范围(任何函数体外)或static关键字声明,否则变量不会被初始化为任何特定值;它的内容将是随机垃圾。
2.在这种情况下,“有效”表示程序中变量的地址。

答案 2 :(得分:1)

实际上问题在于:

scanf("%f",a);

它应该是:

scanf("%f",&a);

据男人说:

  

scanf()系列函数根据格式扫描输入,如下所述。此格式可能包含转换规范;此类转换的结果(如果有)存储在格式为的指针参数指向的位置。每个指针参数必须是适合相应转换规范返回的值的类型。