该程序的目的是通过测试它与前 11 个素数整数的整除性来确定 1 到 1000 之间的数是否为素数。该程序在大多数输入下都能正常运行。但是,当我输入一个整数(例如468)时,会检测到stack smashing。什么是堆栈粉碎以及如何解决此问题?
我曾尝试研究堆栈粉碎,但找不到与我的程序相关的具体示例。我不知道我可以尝试修改程序的替代方法,因为我对 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
最佳答案
char divStatement[] = " is divisible by ";
if ((userInput % 31) == 0) {
div31 = true;
strcat(divStatement, "31, ");
}
divStatement
是一个足够大的字符数组,足以容纳 " is divisible by "
加上一个 \0
终止符。您不能将 "31, "
附加到它,因为它没有任何额外的空闲空间。一个简单的解决方法是为数组提供一个显式长度,该长度足以处理您的程序可能附加的任何内容。
char divStatement[1000] = " is divisible by ";
关于c - 什么是堆栈粉碎以及如何修复它?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58015373/