при чем тут следующий код повреждения кучи? - PullRequest
1 голос
/ 03 марта 2012

Я опубликовал проблему и получил ответ здесь .Вот код, который я отлаживал на 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).

Ответы [ 2 ]

6 голосов
/ 03 марта 2012

Самая большая ошибка, которую я вижу, это то, что вы добавляете 10 к указателю, передаваемому в strlen;это либо будет считывать память вне строки, если длина строки меньше 10 символов, либо вычитает 10 из длины строки в противном случае.Возможно, вы хотите добавить 10 к результату из strlen, а не к входу .

Другими словами, переместите ) после +10 до +10.

2 голосов
/ 03 марта 2012

Эта строка:

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

Принимает строку dir и смещает ее на десять символов перед получением длины.Вы уверены, что не имеете в виду:

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

Кроме того, вы уверены, что есть место и для завершающего символа '\0'?

...