【问题标题】:Segmentation Fault (core dumped).. Not sure why?分段错误(核心转储)..不知道为什么?
【发布时间】:2020-01-28 02:01:48
【问题描述】:

尝试学习如何用 C 编写代码,遇到此错误。

制作一个获取年份并计算它是否是闰年然后打印结果的程序。

我得到的错误是分段错误(核心转储) 用 C 编码真的很新,不知道如何解决这个问题,并且错误不指向特定的行或任何东西。非常感谢一些建议,任何帮助。谢谢!

这是我的代码:


int isLeap(int date){

    if(date%400 == 0){
        return 1;
    }

    if(date%4 != 0){
        return 0;
    }

    if(date%100 != 0){
        return 0;

    }

}


int year;
 int green = 0;

  while(green == 0){

     printf("Enter a year: " );
  scanf("%d", year);


  if(year < 0){
      green++;
  }

  if(isLeap(year) == 1){
      printf("Year %d is a leap year.", year);
  }
  if(isLeap(year) == 0){
      printf("Year %d is not a leap year", year);
  }
}
return 0;

} ```

【问题讨论】:

  • scanf("%d", year); -> scanf("%d", &amp;year);
  • 使用调试器单步执行代码并查看程序崩溃的位置。
  • 不要忘记编译时出现警告:-Wall
  • 95% 的 *NIX 系统中的分段错误与指针、未初始化指针的使用或 @Christian Gibbons 所说的不正确使用有关

标签: c error-handling segmentation-fault


【解决方案1】:

因为您说您是 C 编程的新手,所以让我详细说明一下 Christian Gibbons 上面的评论。答案是正确的,但并没有真正解释原因。这是评论:

scanf("%d", year); -> scanf("%d", &year);

错误Segmentation Fault (core dumped) 表示指针使用不当。或者,在您的情况下,使用非指针值,就好像它是指针一样。指针是内存地址。当您使用指针时,您是在告诉 CPU 从某个地址处的内存中获取信息(或将信息放入)。如果你提供错误的地址,坏事经常发生。

函数scanf() 需要指向从字符串扫描分配值的变量的指针。在您的情况下,您传递了year(年份变量的当前值)而不是&amp;year(年份变量的地址)。

不要绝望。指针一开始很难理解,但坚持下去,你就会明白的。以下是一些您可以了解更多信息的参考资料:

指针:

分段错误:

【讨论】:

    猜你喜欢
    • 2015-05-23
    • 2017-01-26
    • 2019-09-03
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多