ansi c意外行为的问题?

时间:2010-06-08 06:46:38

标签: c stack-overflow buffer-overflow

我患有意外行为;这是问题定义:

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

4 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:7)

这很可能是因为访问某些数组的边界之外。它也可能是一个未初始化的指针问题。

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

与其他人在此处提到的一样,如果您是Linux / UNIX,请使用valgrind并同时使用调试器。尝试运行:

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

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

一些常见的嫌疑人:

  1. 检查您是否使用固定大小的数组。就像char buf [128];可能看起来很可爱,但比松鼠更糟糕
  2. 请以主的名义取得()和puts()系统调用
  3. 尝试使用STL字符串或crope,无论什么对你有用。