2017-01-12 5 views
-1

Я пытаюсь перекодировать функцию strcat с изображением автомаллока внутри него. Я вижу в нескольких тестах, что в моей функции есть некоторые утечки данных (я не знаю правильного слова).утечки в my_strcat с malloc

Вот мой код:

char *my_strcat(char *a, char *b) 
{ 
    char *result; 
    int i; 
    int j; 
    int la; 
    int lb; 

    la = -1; 
    lb = -1; 
    while (a[++la] != '\0'); 
    while (b[++lb] != '\0'); 
    result = malloc(sizeof(char) * (la + lb) + 1); 
    i = -1; 
    while (a[++i] != '\0') 
    result[i] = a[i]; 
    j = -1; 
    while (b[++j] != '\0') 
    result[i + j] = b[j]; 
    result[i + j] = '\0'; 
    return (result); 
} 

Так что, когда я пытаюсь использовать мой my_strcat в цикле в то время как с некоторыми строками один длинами я получаю:

a.out: malloc.c:2392: sysmalloc: Assertion `(old_top == initial_top (av) && old_size == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse (old_top) && ((unsigned long) old_end & (pagesize - 1)) == 0)' failed. 
Aborted (core dumped) 

Я пытаюсь найти где происходит утечка памяти. Но я не могу понять.

Вот вызывающая часть:

while (!is_line_ended(read_result)) 
{ 
    read(fd, read_result, READ_SIZE); 
    result = my_strcat(result, read_line(read_result, fd)); 
} 

Вот MY_STRLEN:

# define MY_STRLEN(s) (sizeof(s)/sizeof(s[0])) 

Пожалуйста, обратите внимание, что я ограничен в один файл и один заголовок. Я ограничен 5 функциями по файлу, и мне не разрешено использовать строковые функции.

+1

Почему вы должны '|' в конце каждой строки? – mch

+0

Э-э, я их не вижу:/Возможно, потому, что я скопировал из emacs – Orionss

+0

_one-length strings_, что означает t? – LPs

ответ

1

Проблема заключается в том макрос # define MY_STRLEN(s) (sizeof(s)/sizeof(s[0])):

sizeof(s) не возвращает длину строки s, а скорее размер типа s «s, т.е. sizeof(char*).

Используйте strlen(s) вместо вашего макроса; и если - по любой причине - вы не можете использовать strlen, вы можете использовать следующую функцию:

int my_strlen(const char* s) { 
    int len=0; 
    while (*s++ != '\0') 
    len++; 
    return len; 
} 
+0

Спасибо, я знаю это, но я не мог использовать еще одну функцию. я решил это, я публикую код – Orionss