1

我发布了一个问题并在这里得到了答案。这是我在 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。

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

4

2 回答 2

6

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

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

于 2012-03-03T07:03:28.220 回答
2

这一行:

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

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

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

另外,你确定终止'\0'角色也有空间吗?

于 2012-03-03T07:06:06.233 回答