【发布时间】:2016-09-17 13:01:12
【问题描述】:
我正在尝试编写一个简单的 C 程序,该程序接受一个数字的输入并返回数字的数字之和以及数字的倒数。该程序目前不完整,因为我在测试时不断遇到 Segmentation Fault 错误。
代码如下:
#include <stdio.h>
#include <string.h>
int sumdigits(int);
int main() {
int num; // The number to be read
int reverse; // The reverse of the input
int sum; // The sum of the digits
printf("Enter a number: ");
scanf("%d", &num);
sum = sumdigits(num);
printf("Sum of digits: %s", sum);
}
int sumdigits(int number) {
int sum = 0;
int temp = number;
while (temp != 0) {
sum += (temp % 10);
temp /= 10;
}
return sum;
}
通过使用一些打印语句,我发现错误很可能发生在以下几行中:
printf("Enter a number: ");
scanf("%d", &num);
我可以输入一个数字,但紧接着我收到一条消息说分段错误(核心转储)并且程序退出。以 sudo 权限运行程序只会提供分段错误,而没有消息的“核心转储”部分。
here 后面的指令提供的调试信息似乎表明 printf 语句是导致错误的原因,因为这是输出:
(gdb) run
Starting program: /home/sschmalz/Documents/Classes/CIS308/proj1/debug
Enter a number: 123
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7a62fb4 in vfprintf () from /lib64/libc.so.6
但是,我不知道如何处理这些信息,因此无法解决错误。
我已就实验室中的同样错误向我的教授寻求帮助,但他无法找到解决方案。这已经发生在两个不同的实验室,加上这个项目,这让我觉得这可能与我的计算机设置有关,而不是与代码本身有关。
我正在使用 vim 编写程序并使用 gcc 进行编译。在大多数情况下,我不会重命名编译器的输出,所以我使用“./a.out”运行它。我使用 Fedora 24 编写和运行这些程序。如果需要有关我的系统的任何其他信息,请告诉我。
【问题讨论】:
-
通过
%s转换将int传递给printf()的未定义行为。 -
我计算机上的编译器由于某种原因没有捕获字符串格式错误。我将文件上传到我大学的 Linux 服务器并在那里编译它,这给了我异常和修复。谢谢大家的帮助,这么小的问题我都觉得自己是个白痴。
标签: c segmentation-fault runtime-error