gpt4 book ai didi

c - 什么是堆栈粉碎,我该如何解决?

转载 作者:太空狗 更新时间:2023-10-29 15:46:32 25 4
gpt4 key购买 nike

此程序的目的是通过测试其与前 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

最佳答案

char divStatement[] = " is divisible by ";

if ((userInput % 31) == 0) {
div31 = true;
strcat(divStatement, "31, ");
}

divStatement 是一个 char 数组,大小刚好足以容纳 "可以被 " 加上一个 \0 终止符整除。您不能将 "31, " 附加到它,因为它没有任何额外的松弛空间。

一个简单的解决方法是为数组指定一个明确的长度,该长度足以处理您的程序可能追加的任何内容。

char divStatement[1000] = " is divisible by ";

关于c - 什么是堆栈粉碎,我该如何解决?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58015373/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com