堆下面的代码腐败怎么办?

时间:2012-03-03 07:00:32

标签: c recursion heap-corruption create-directory

我发布了一个问题并得到了答案here。 这是我在VC2010上调试的代码。我得到了最后显示的运行时错误。 使用 sdir 有什么问题?

#include<iostream>
#include<stdlib.h>

#include<windows.h>
void make_dir(int depth, char *dir) {
  if (depth < 3) {

    CreateDirectoryA (dir,NULL); 

    for (int i = 0; i < 10; i++) {
       char *sdir= (char*)malloc(strlen(dir+10)); // XXX 10?
        strcpy(sdir, dir);
        sprintf(sdir + strlen(sdir), "\\%d", i); 
        printf("%s\n", sdir);
        CreateDirectoryA(sdir,NULL);
        make_dir(depth + 1, sdir);
        free(sdir);
    }   
  }     
}

int  main()
{
    make_dir(0,"dir");
    return 1;
}

错误是:

  

HEAP [mkdir.exe]:堆积块004114E8修改为00411514过去请求的大小为24   Windows已在mkdir.exe中触发了断点。

     

这可能是由于堆的损坏,这表明存在错误   mkdir.exe或它加载的任何DLL。

     

这也可能是因为用户在mkdir.exe时按F12   对焦。

     

输出窗口可能包含更多诊断信息。该程序   &#39; [3008] mkdir.exe:Native&#39;已退出代码0(0x0)。

2 个答案:

答案 0 :(得分:6)

我看到的最明显的错误是你向传递给strlen的指针添加了10;如果字符串长度小于10个字符,这将读取字符串外部的内存,否则将从字符串的长度中减去10。您可能希望在strlen结果中添加10,而不是输入

换句话说,将)移到+10之后移到+10之前。

答案 1 :(得分:2)

这一行:

char *sdir= (char*)malloc(strlen(dir+10));

这将获取字符串dir并在获取长度之前将其偏移10个字符。你确定你的意思不是:

char *sdir= (char*)malloc(strlen(dir)+10);

此外,您确定还有终止'\0'字符的空间吗?