【问题标题】:what do the following code corruption of heap?堆的以下代码损坏是什么?
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    这一行:

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

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

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

    另外,您确定终止 '\0' 字符也有空间吗?

    【讨论】:

      猜你喜欢
      • 2010-12-03
      • 1970-01-01
      • 2015-03-04
      • 2011-12-03
      • 2013-11-24
      • 1970-01-01
      • 2014-05-04
      • 2021-11-11
      • 2019-10-23
      相关资源
      最近更新 更多