Проблемы с ошибкой буфера кучи в C - PullRequest
1 голос
/ 09 октября 2009

В моей программе C появляется следующая ошибка:

Writing to heap after end of help buffer

Можете ли вы сказать мне, что мне не хватает?

char * path_delimiter(char * path)
{
    int i = 0, index = 0, size = 0, length = (int)strlen(path);
    char *tmp, *ans;

    for(; i < length; i++) {
        if(path[i] == PATH_DELIM[0]) {
          break;
        }
    }
    i++;
    size = (int)strlen(path) - i;
    ans = (char*)malloc(sizeof(path));
    tmp = (char*)malloc(size);
    strcpy(ans,path);
    ans[i-1] = END_ARRAY;

    if(size > 0)
    {
        strcpy(tmp,&path[i]);
        realloc(path,size);
        strcpy(path,tmp);
    }
    else 
    {
        strcpy(path,ans);
    }
free(tmp);

return ans;
}

Ответы [ 3 ]

8 голосов
/ 09 октября 2009

Это ...

sizeof(path)

... совпадает с ...

sizeof(char *)

... это размер указателя (а не размер буфера, на который он указывает), поэтому, вероятно, он равен 4.

Итак, это ...

ans= (char*)malloc(sizeof(path));

... это 4-байтовый буфер, и вот так ...

strcpy(ans,path);

... перезаписывает (пишет после конца) этот буфер.

Вместо ...

malloc(sizeof(path));

... думаю, вы хотите ...

malloc(strlen(path)+1);
5 голосов
/ 09 октября 2009

Вы не проверяете, успешно ли malloc и realloc. Что еще более важно, realloc может вернуть другой дескриптор, который вы отбрасываете.

Далее у вас есть:

ans = malloc(sizeof(path));
...
strcpy(ans, path);

На самой распространенной сегодня платформе sizeof(path) - это, скорее всего, 4 или 8, независимо от длины массива символов, на который указывает path.

0 голосов
/ 09 октября 2009

Обычно требуется size = strlen(xxx) + 1;, чтобы разрешить нулевой терминатор в строке.

В этом случае, я думаю, вам нужно:

size = strlen(path) - i + 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...