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

Joh*_*ohn 1 c recursion create-directory heap-corruption

我发布了一个问题并在这里得到了答案.这是我在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;
}
Run Code Online (Sandbox Code Playgroud)

错误是:

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

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

这也可能是由于用户在mkdir.exe具有焦点时按下F12.

输出窗口可能包含更多诊断信息.程序'[3008] mkdir.exe:Native'已退出,代码为0(0x0).

ick*_*fay 6

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

换句话说,)+10之前移动到之后+10.