c++ - 64位系统下程序崩溃

标签 c++ c gdb

以下代码在 64 位系统中崩溃。如果文件名长度小于3, 然后'len'发生下溢。但这个程序没有显示任何 32 位系统中的段错误。但我在 64 中遇到段错误 位系统。为什么这个程序在 32 位中没有显示任何段错误 系统?

 DIR * dirp = opendir(dirPath);
 struct dirent * dp;
 while(dirp)
 {
   if((dp = readdir(dirp)) != NULL)
   {
    unsigned int len = strlen(dp->d_name);
    //underflow happens if filename length less than 3
    if((dp->d_name[len - 3] == 'j'))
    }
  }

最佳答案

正如您所知,您的编程会导致未定义的行为。您正在尝试访问数组范围之外的内容。未定义的行为正如其听起来的那样。行为未定义。什么事情都可能发生。

您可能会在运行时遇到段错误,而另一次则不会。或者您可能会在不同的编译器下看到不同的行为。未定义的行为本质上是不可预测的。事实上,您似乎在一个编译器下的代码中逃脱了这个错误,但这并不意味着您的代码是正确的。

显然,您应该做的是避免编写导致未定义行为的程序。

关于c++ - 64位系统下程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24385052/

相关文章:

c - 将指针与函数和结构一起使用

c - GNU gdb 如何显示源文件名和符号行

c++ - valgrind + gdb 的 Eclipse CDT 设置

android - 我看不到使用 gdb 加载的 coredump 中的符号

c++ - eclipse CDT : multiple C++ files in single project

c++ - 一个离开析构函数的有效异常案例

c - C 中 scanf 中的扫描集行为

c++ - Visual Studio "Application failed to start because the application configuration is incorrect"错误

c++ - 是否不再包含在 MinGW 和/或 MSYS 中?

c - 这段 C 代码是如何工作的?