2017-01-12 11 views
-1

私は内部に自動mallocを備えたstrcat関数を再コードしようとしています。 いくつかのテストで、私の機能にデータ漏れ(正しい単語がわからない)があることがわかりました。ここでmallocでmy_strcatにリークがあります

は私のコードです:

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); 
} 

だから私は私が得るいくつかのいずれかの長さの文字列でwhileループで私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])) 

私は1つのファイルと1つのヘッダに限定さだということに注意してください。私はファイルごとに5つの関数に制限されており、文字列関数を使用することはできません。

+1

なぜあなた持って '|'各行の終わり: - 何らかの理由 - 場合は、あなたがstrlen使用することを許可されていない、あなたは次の関数を使用することができますか? – mch

+0

私はそれらを見ない:/おそらく私はemacsからコピー貼り付けたものだ – Orionss

+0

_one-length strings_何を意味するのだろうか? – LPs

答えて

1

問題はマクロ# define MY_STRLEN(s) (sizeof(s)/sizeof(s[0]))です:

sizeof(s)はすなわちsizeof(char*)sの文字列の長さではなく、むしろsの型のサイズを返しません。

マクロの代わりにstrlen(s)を使用してください。

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

ありがとう、私は知っているが、私はもう一つの機能を使用することができませんでした。私はそれを解決した – Orionss

関連する問題