【发布时间】:2019-09-19 16:30:48
【问题描述】:
这个程序的目的是通过测试它与前 11 个素数整数的可分性来确定 1 到 1000 之间的数字是否为素数。该程序在大多数输入下都能正常运行。但是,当我输入一个整数(例如 468)时,会检测到堆栈粉碎。什么是堆栈粉碎,我该如何解决?
我曾尝试研究堆栈粉碎,但找不到与我的程序相关的具体示例。我不知道我可以尝试修改程序的替代方法,因为我对使用 C 进行编程相对较新。
char divStatement[] = " is divisible by ";
if ((userInput % 31) == 0) {
div31 = true;
strcat(divStatement, "31, ");
}
if (div2 || div3 || div5 || div7 || div11 || div13 || div17 || div19 || div23 || div29 || div31) {
divStatement[strlen(divStatement) - 2] = '.';
divStatement[strlen(divStatement) - 1] = '\n';
printf("%d%s", userInput, divStatement);
printf("%d is not prime.\n", userInput);
}
else {
printf("%d is prime.\n", userInput);
}
输出实际上工作正常。然而,在程序结束时,终端输出:
***stack smashing detected ***: ./a.out terminated
Aborted
【问题讨论】:
-
使用数组而不是不合理数量的变量全部挤在一起会好很多。
-
无关,但这段代码需要大量重构。
-
很确定您的
strcat()正在尝试修改只读内存,并且还可能经过数组的末尾(如果有效,它在堆栈上。)阅读如何strcat() 有效(然后在可写内存中为字符串分配更多空间。) -
在询问有关运行时问题的问题时,就像这个问题一样,发布minimal reproducible example 显示输入、实际输出和预期输出。注意:发布的代码应该可以干净地编译,而不是从某些代码中间截取的片段
标签: c stack-smash