【问题标题】:Execution error in c: "Segmentation fault (core dumped)"c中的执行错误:“分段错误(核心转储)”
【发布时间】:2016-03-13 20:12:58
【问题描述】:

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

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

【问题讨论】:

  • 然后调高编译器警告级别。例如:适当配置,clang 显示:“main.c:5:16: 格式指定类型 'float *' 但参数的类型为 'double'”

标签: c input segmentation-fault scanf


【解决方案1】:

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

scanf("%f",&a);

注意:当使用 & 时,您使用的是该变量的内存位置(与指针相同)。

您遇到 seg 错误的原因是,在 scanf 内部,一旦函数接收到用户输入,它就会按照以下方式执行一些操作

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

如果您直接传递变量,它将尝试尊重包含的值。

【讨论】:

  • 我想我明白了,但是..在这段代码中为什么我们不需要放 '&' ?,程序确实运行良好:{ char str1[20], str2[30]; printf("请输入姓名:"); scanf("%s", str1); printf("请输入您的网站名称:"); scanf("%s", str2); printf("输入的名称:%s\n", str1); printf("进入的网站:%s", str2);返回(0); }
  • 记住在声明 char str1[20]; 时str1 是一个数组的标签,其功能与指针非常相似,只是你不能修改 str1。当将 str1 传递给 scanf 时,它与传递 &str1[0] 相同,这将是数组开始的内存位置或指向数组的“指针”
  • 如果我的回答有助于考虑接受[链接]我的回答 (stackoverflow.com/help/accepted-answer)
【解决方案2】:

scanf 需要变量a地址;您实际传递的是变量a内容,这是a)不确定1,b)很可能不是一个有效的2 地址。

需要使用一元&amp;操作符获取a地址

scanf( "%f", &a );

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

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


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

【讨论】:

    【解决方案3】:

    其实问题就在这里:

    scanf("%f",a);
    

    应该是:

    scanf("%f",&a);
    

    根据男人的说法:

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

    【讨论】:

      猜你喜欢
      • 2021-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      • 2017-02-25
      • 2016-07-12
      • 2018-03-16
      相关资源
      最近更新 更多