调用函数后检测到 C 堆栈粉碎

Posted

技术标签:

【中文标题】调用函数后检测到 C 堆栈粉碎【英文标题】:C Stack smashing detected after calling a function 【发布时间】:2012-06-21 17:13:27 【问题描述】:

遇到了一个对我来说毫无意义的问题。所以这里是:

我有一个函数可以计算一个单词在文件中出现的次数,因此这个函数返回一个整数 (int)。所以在另一个功能上它使用“计数器”。现在由于某种原因,它决定开始启动堆栈粉碎检测到的错误。我已经对整个程序进行了 2 周的测试,它运行得非常完美。现在我得到了那个错误,这真的没有意义。世界上到底发生了什么?错误就在那里,在函数有计数器并返回后,它会启动堆栈粉碎检测到的错误。

编辑: 我一直在搜索,是的,当返回一个 int 函数时,我得到一个堆栈粉碎检测错误。有任何想法吗?如果我取出该代码,它不会崩溃。我真的不知道

有什么建议吗?

谢谢...

【问题讨论】:

你的字数统计函数使用递归吗? 我做了两个程序,一个递归版本和一个非递归版本。由于某种原因,两者都失败了......但是可以说它是递归,问题可能出在哪里?我想不通。 在第 42 行,数组的索引超出范围。 【参考方案1】:

我可以建议使用调试信息编译您的程序并在Valgrind 下运行它吗?另见this related question。

如果您需要,我在an older answer of mine 中发布了一些使用 Valgrind 的提示。

【讨论】:

我愿意接受任何建议。我会试一试。返回 int 函数时出现此错误仍然让我担心...... @Alessandroempire:实际错误很可能在其他地方。试试 Valgrind - 它通常比你更清楚你的程序在做什么...... 是的,我虽然也一样,但是当我取消该功能时,它是否起作用是不是太巧合了?如果我发现任何关于 valgrind 的信息,我会告诉你的 @Alessandroempire:删除甚至只是重新排列代码会改变程序的内存布局。它可以很容易地隐藏或揭示现有的错误...... 发现错误。在计算一个单词出现在一个文件上的次数的函数中,首先我使用 fopen 然后使用 fscan(file_descriptor, "%s", buffer)。其中缓冲区是一个字符 [20]。现在,当我使缓冲区变大时,我没有遇到问题。为什么?出于某种原因,我无法理解,他正在阅读一个超过 20 个字符的单词。因此,如果您将其设为 50,则不会引发错误。我会给它一个更好的外观,但听起来是正确的,为什么我得到了堆栈溢出。想法?

以上是关于调用函数后检测到 C 堆栈粉碎的主要内容,如果未能解决你的问题,请参考以下文章

在程序结束时检测到堆栈粉碎

在函数中操作int的数组时堆栈粉碎错误

检测到堆栈粉碎 glGetTexImage

使用 c++ 偶尔检测到 *** 堆栈粉碎***

Lua中调用C函数

汇编中函数调用时的堆栈结构