- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我编写了一个程序来使用递归查找数字的素因数。我收到运行时错误。原因是什么?
#include<stdio.h>
int main () {
int num , i = 2 ;
printf ( " Enter the number to find the prime factors\n ") ;
scanf ( "%d", &num ) ;
printf ( " The factors are :\n") ;
pf ( num , i ) ;
}
int pf ( int num , int i){
if ( num % i == 0 ){
if ( checkprime(i) == 1){
printf ( " %d " , i ) ;
num = num / i ;
}
}
if ( num > 1 ){
i++ ;
pf ( num , i ) ;
}
}
int checkprime ( int i){
int j ;
if (i==2)
return 1 ;
for ( j = 2 ; j < i ; j++ ){
if ( (i % j) == 0 )
return 0 ;
else
return 1 ;
}
if ( i==j )
return 1 ;
}
示例运行:
Enter the number to find the prime factors
12
The factors are :
Segmentation fault (core dumped)enter code here
最佳答案
这看起来像是您想要自己解决的学习练习,所以我不会为您编写代码。 (如果您尝试将此处的示例代码插入到您的程序中而不进行重构,它将无法工作。)
本着授之以鱼的精神,你应该做的第一件事是在不进行优化的情况下进行编译,使用调试符号,并打开所有警告。在 gcc/clang/icc 上,其标志类似于:
-std=c11 -Wall -Wextra -Wpedantic -Wconversion -g
这段代码甚至不应该编译。你不断地陷入到一个不 return
的函数的末尾。 void
类型,但没有 return
失败陈述。不仅如此,您定义 pf()
和checkprime()
在没有原型(prototype)的情况下调用它们之后!这不是唯一的错误,但让我们从这里开始。
从技术上讲,你应该有一个 return
来自main()
,也是如此,但很多程序都没有这样做,以至于 C 委员会只是屈服并说它是可选的。
捕获错误的下一步是在调试器中加载程序,在要调试的函数上放置断点,然后单步执行它。
当你这样做时,你会发现如果你给它,程序进入无限循环,比方说,4
,如果你确实给它一个终止的答案,例如 pf(1, 2)
,它将穿过所有 if
block 并且永远不会到达 return
声明。
所以你需要调试你的算法,但首先,你需要确保通过你的函数的每条路径都达到 return
陈述。 (如果您实际上不需要返回值,您也可以声明 void pf(int, int)
。
我喜欢这样做的一种方法(但在 C 中似乎并不常见)是编写 if
-else
-return
与 ?
运算符,例如:
return (num <= 1) ? 1 : // No more factors.
(num % i == 0) ? pf( num/i, i ) : // Prime factor, with possible multiplicity.
pf( num, i+1 ); // Not a factor. Keep looking.
这当然在这里不起作用,因为它从不打印因子。 (它基于函数式代码,不应该有像 I/O 这样的副作用。)修复它的一种方法是用 if
重写。/then
/else
。另一种是将因子存储在数据结构(例如动态数组或链表)中,然后返回。另一种是在复数之前打印return
。另一种方法是让应该打印因子的分支调用一个相互递归函数,该函数打印然后调用 pf()
。一个你不应该做的非常丑陋的黑客行为是使用逗号运算符。选择您最喜欢的一个。
这样做的优点是尾递归,因此可能会进入无限循环,但不会导致堆栈溢出。
如果你不喜欢这种风格,一些商店用来防止这种错误发生的另一种方法是用嵌套if
来编写函数。设置像 int to_return = UNSET;
这样的变量的 block 。然后,每个分支设置 to_return
到适当的值,你可以用类似的东西来完成
if (foo)
to_return = 1;
else
to_return = f(i);
asseert(to_return != UNSET);
return to_return;
这样,编译器可以确保您从有效分支返回,或者如果您忘记沿某个路径设置返回值,编译器会崩溃并告诉您位置和原因,而不是“段错误(核心转储)”。 ”
关于c - 'Segmentation fault (core dumped) '是什么原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57816114/
主要思想是将 EF Core nuget 包添加到 .NET Core 库项目,然后在一堆应用程序(例如 ASP.NET Core、Win 服务、控制台应用程序)中使用该库,而无需在每个应用程序中配置
我想要实现的是编写一个简单的.net核心后台工作程序(.net core 3.1)的代码,在该工作程序作为Windows服务运行时,我在其中将数据写入SQL Server数据库(通过EF Core 3
关于 .Net Core SDK download page 二进制文件有什么用?它与安装程序有何不同? 最佳答案 二进制文件是 .NET Core 的编译代码。它们拥有运行 .NET Core 所需
.NET Core 和 Entity Framework Core 之间的区别?我们可以在 .NET Core 中使用 Entity Framework Core 吗?两者都有什么优势? 最佳答案 E
.NET Core 和 ASP.NET Core 到底有什么区别? 它们是相互排斥的吗?我听说 ASP.NET Core 是基于 .NET Core 构建的,但它也可以基于完整的 .NET 框架构建。
我对 ASP.NET Core 开发完全陌生。我正在尝试使用单个模型和 mysql 创建一个简单的 asp.net core Web api 来存储模型数据,然后我想使用 Swagger 将其作为 R
.NET Core 和 Entity Framework Core 之间的区别?我们可以在 .NET Core 中使用 Entity Framework Core 吗?两者都有什么优势? 最佳答案 E
好吧,作为一个新的 .net 开发生态系统,我有点迷失在核心工具、版本等方面。 有人可以解释我之间的区别吗 VS 2015 核心工具预览版 x - See here .NET Core/SDK 与否
我已阅读有关如何通过信号器核心集线器从后台服务向客户端发送通知的文档。如何从客户端接收到后台服务的通知? 后台服务应该只是一个单例。 public class Startup { public
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 4年前关闭。 Improve t
非常简单的问题: 我正在尝试创建一个像这样的谓词构建器: var predicate = PredicateBuilder.False(); 但似乎在Net Core和EF Core中不可用。
在 .NET Core 自包含应用程序 中...我们需要在 project.json 中指定运行时 (RID) 我们希望我们的应用程序针对...发布为什么会这样? .NET Core 是跨平台的,与我
如何用 iCloud Core Data 替换我现有的 Core Data?这是我的持久商店协调员: lazy var persistentStoreCoordinator: NSPersistent
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 2 年前。 Improv
今天我正在学习新的 ASP.net 核心 API 3.1,我想将我的旧网站从 MVC4 转移到 Web API。除了一件事,一切都很好。数据库连接。在我的旧网站中,我为每个客户端(10/15 数据库)
我在 Visual Studio 2015 Update 3 和 .NET Core 1.0 中工作。我有一个 .NETCoreApp v1.0 类型的 Web API 项目。当我添加一个 .NET
我一直在尝试遵循 Ben Cull ( http://benjii.me/2016/06/entity-framework-core-migrations-for-class-library-proj
当我打开我的 vs 代码程序时,我收到以下消息: 无法找到 .NET Core SDK。 .NET Core 调试将不会启用。确保 .NET Core SDK 已安装并且在路径上。 如果我安装甚至卸载
我偶然发现了一个非常奇怪的问题。每当 Web 应用程序启动时,dotnet.exe 都会使用相当多的内存(大约 300M)。然而,当它触及某些部分时(我感觉这与 EF Core 使用有关),它会在短时
ASP.NET Core Web (.NET Core) 与 ASP.NET Core Web (.NET Framework) 有什么区别? .NET Framework 是否提供 similar
我是一名优秀的程序员,十分优秀!