以下代码在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'))
}
}
Run Code Online (Sandbox Code Playgroud)
您似乎意识到,您可以根据未定义的行为对结果进行编程.您试图访问数组边界之外.并且未定义的行为正是听起来的样子.行为未定义.什么事情都可能发生.
一旦运行,您可能会遇到分段错误,而不是另一次.或者您可能会在不同的编译器下看到不同的行为.未定义的行为本质上是不可预测的.你似乎在一个编译器下的代码中逃脱了这个错误的事实并没有使你的代码正确.
显然,你应该做的是避免编写导致未定义行为的程序.