【问题标题】:Float value suddenly becoming huge浮动价值突然变得巨大
【发布时间】:2011-01-29 11:33:45
【问题描述】:

我宁愿不转储代码,而是解释我的问题。经过数小时的调试,我终于明白,在我的代码中,未显式修改的浮点值会变成巨大的(超过 1e15)。我的程序确实使用了大量内存(一个包含 800 多个单词的字符串数组),但除此之外,我不知道是什么原因造成的。

如果有人对此有任何想法,请分享。否则,我会发布一个pastebin 代码很快。

编辑: 这是代码:http://pastebin.com/vgiZweNq。问题在于next_generation() 函数,其中sumfit 变量在循环中随机出现。

另外,我在 linux 上使用 -fno-stack-limit-fstack-check 编译了这个,以避免堆栈溢出。

编辑 2: 我已将程序更改为使用动态分配的链表,以进一步避免堆栈溢出。尽管如此,sumfit 还是会随机更改为 Floatzilla,通常是在很早的时候。

干杯!

【问题讨论】:

  • 如果你没有明确地接触这个变量,我们最好的猜测是一些内存管理错误。贴出代码,今天水晶球朦胧。
  • 请分享代码。尝试将其归结为 float 感染抱炎的部分。
  • 您的错误是由于某个地方的错误引起的,很可能是缓冲区溢出。通过 Valgrind 运行您的代码。
  • 使用数据断点让调试器在被修改时中断。
  • @Hans - 同意,数据断点绝对是追踪这类事情的最佳方式。

标签: c floating-point


【解决方案1】:

由于变量显然是从一个意外点修改的,您可能需要检查一些可能性:

  • 是从不同的线程还是从中断/事件处理程序修改的?如果是,访问是否正确同步以防止数据争用?
  • 您是否正在执行可能存在错误并导致访问预期缓冲区之外的指针算术?
  • 您是否在不同大小的类型之间转换指针?
  • 尤其是在您使用嵌入式设备时:可能内存已满,而您的堆栈与堆或全局变量重叠。

有关发生这种情况的平台的更多信息会有所帮助。

【讨论】:

    【解决方案2】:

    您在 chrom 数组上使用 strcpy,但我看不到它们在哪里得到 null 终止。

    不过,也许我只是想念它。

    【讨论】:

      【解决方案3】:

      你有一个巨大的字符串数组。我想你可能会结束它。跟踪进入该数组的数据大小。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-25
        • 2021-10-21
        • 2014-08-28
        相关资源
        最近更新 更多