【发布时间】:2012-03-03 07:00:31
【问题描述】:
我发布了一个问题并得到了答案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。
这也可能是由于用户按下 F12 而 mkdir.exe 重点。
输出窗口可能有更多的诊断信息。该程序 '[3008] mkdir.exe: Native' 已退出,代码为 0 (0x0)。
【问题讨论】:
-
不要在 C 程序中转换来自
malloc()的返回值。 -
@CarlNorum:我经常使用它,因为如果我不这样做,VC2010 报告无法从 'void *' 转换为 'char *'。我很高兴知道是否有其他解决方案
-
这意味着您正在使用 C++ 编译器编译程序。你可能也不想这样做。
-
@Carl,他正在明确地编译它具有 C++,并带有他正在使用的包含。约翰,不要混淆 C 和 C++,这是两种不同的语言。
-
好电话,@JensGustedt!我只是看了标签...
标签: c recursion heap-corruption create-directory