2009-10-09 1 views
1

я получаю следующее сообщение об ошибке в моей программе C:Проблемы с Error «буфера для» в 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; 
} 
+0

Исправьте форматировать код: Нажмите на ссылку 1010 и отступ для каждого код в строке 4 пространства - больше, чтобы показать отступы в коде. – PTBNL

+2

Используйте пробелы и фигурные скобки. –

+3

Это поможет узнать, что вы пытаетесь сделать. Например, как вы думаете, 'malloc (sizeof (path))' делает? –

ответ

5

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

Кроме того, у вас есть:

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

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

8

Это ...

sizeof(path) 

... так же, как ...

sizeof(char *) 

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

так это ...

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

... это 4-байтный буфер, и поэтому этот ...

strcpy(ans,path); 

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

Вместо того, чтобы ...

malloc(sizeof(path)); 

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

malloc(strlen(path)+1); 
+1

К OP: Пожалуйста, теперь используйте strncpy. Это сэкономит вам много головных болей по дороге. – Calyth

+0

Не должно быть: malloc (sizeof (char) * (strlen (path) +1)); Вы принимаете char 1 байт. – Andrew

+2

Andrew, я думаю, 'sizeof (char)' всегда равен 1, по определению. – ChrisW

0

Вы обычно нужно size = strlen(xxx) + 1;, чтобы обеспечить нулевой терминатор на струне.

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

size = strlen(path) - i + 1; 
+0

thans для вас все это решает мою проблему ...но, конечно, когда я использую метод strlen, мне нужно добавить 1 для «\ 0», если нет, то зачем мне нужен +1 еще раз спасибо – 2009-10-09 22:49:42

+0

Функция 'strlen()' подсчитывает количество символов в строке исключая завершающий нуль. Когда вы выделяете память, вы должны выделить достаточно памяти для строки, включая завершающий нуль, что, следовательно, означает «strlen (any) +1» байты. –