-1

我正遭受意外行为的困扰;这是问题定义:

我有应用程序通过 UDP 协议在 LAN 上进行通信。我正在从文本文件中读取 IP 地址和端口号。最初,IP 地址和端口号运行良好,但一段时间后,存储在 char 数组中的 IP 地址已损坏,并且它采用垃圾值。此外,文件写入也受此影响。我的意思是 IP 数组中的值也写在由同一应用程序编写的文本文件中。我不明白是什么问题 - 你能帮忙吗?

4

4 回答 4

7

这几乎可以肯定意味着您有缓冲区溢出 - 甚至可能是堆栈溢出。您可能正在将太多字节读取到太小的字节数组中,并且运行超出分配空间的末尾并践踏您的其他数据(例如 IP 地址)。

如果您使用的是 Linux,请考虑使用valgrind来帮助诊断问题。

于 2010-06-08T06:51:27.927 回答
7

这很可能是由于访问了某个数组的边界之外。也可能是未初始化的指针问题。

如果您使用的是 Linux,请尝试在valgrind下运行您的程序。确保所有阵列都足够大。考虑添加assert()s 来检查您的数组索引是否正常等。

于 2010-06-08T06:51:37.990 回答
0

如果您正在使用 memcpy() 复制数据,请检查您是否使用了正确的大小参数,或者您是否正在使用 strcpy() 确保您将一个以 null 结尾的字符串传递给 strcpy() 不正确的大小给 memcpy 或没有 null 的字符串最后传递给 strcpy() 的 char 将导致这些函数写入超出目标缓冲区的预期边界并导致内存损坏。可能还有其他原因,例如终止条件不正确的循环等。请在此处粘贴您的代码,以便我们查看。

于 2010-06-08T08:08:47.063 回答
0

就像这里提到的其他人一样,如果您是 Linux/UNIX 则使用 valgrind 并同时使用调试器。尝试运行:

valgrind --db-attach=yes --db-command=</path/to/gdb -nw %f %p>

在第一个错误实例中,valgrind 将停止并提示您附加调试器。

几个常见的嫌疑人:

  1. 检查您是否使用固定大小的数组。char buf[128] 之类的东西;可能看起来很可爱,但比毛绒松鼠还差
  2. 奉上帝之名,请不要进行 gets() 和 puts() 系统调用

尝试使用 STL 字符串或裁剪,任何适合您的方法。

于 2010-06-08T09:04:14.580 回答