我正遭受意外行为的困扰;这是问题定义:
我有应用程序通过 UDP 协议在 LAN 上进行通信。我正在从文本文件中读取 IP 地址和端口号。最初,IP 地址和端口号运行良好,但一段时间后,存储在 char 数组中的 IP 地址已损坏,并且它采用垃圾值。此外,文件写入也受此影响。我的意思是 IP 数组中的值也写在由同一应用程序编写的文本文件中。我不明白是什么问题 - 你能帮忙吗?
我正遭受意外行为的困扰;这是问题定义:
我有应用程序通过 UDP 协议在 LAN 上进行通信。我正在从文本文件中读取 IP 地址和端口号。最初,IP 地址和端口号运行良好,但一段时间后,存储在 char 数组中的 IP 地址已损坏,并且它采用垃圾值。此外,文件写入也受此影响。我的意思是 IP 数组中的值也写在由同一应用程序编写的文本文件中。我不明白是什么问题 - 你能帮忙吗?
这几乎可以肯定意味着您有缓冲区溢出 - 甚至可能是堆栈溢出。您可能正在将太多字节读取到太小的字节数组中,并且运行超出分配空间的末尾并践踏您的其他数据(例如 IP 地址)。
如果您使用的是 Linux,请考虑使用valgrind来帮助诊断问题。
这很可能是由于访问了某个数组的边界之外。也可能是未初始化的指针问题。
如果您使用的是 Linux,请尝试在valgrind下运行您的程序。确保所有阵列都足够大。考虑添加assert()
s 来检查您的数组索引是否正常等。
如果您正在使用 memcpy() 复制数据,请检查您是否使用了正确的大小参数,或者您是否正在使用 strcpy() 确保您将一个以 null 结尾的字符串传递给 strcpy() 不正确的大小给 memcpy 或没有 null 的字符串最后传递给 strcpy() 的 char 将导致这些函数写入超出目标缓冲区的预期边界并导致内存损坏。可能还有其他原因,例如终止条件不正确的循环等。请在此处粘贴您的代码,以便我们查看。
就像这里提到的其他人一样,如果您是 Linux/UNIX 则使用 valgrind 并同时使用调试器。尝试运行:
valgrind --db-attach=yes --db-command=</path/to/gdb -nw %f %p>
在第一个错误实例中,valgrind 将停止并提示您附加调试器。
几个常见的嫌疑人:
尝试使用 STL 字符串或裁剪,任何适合您的方法。