2016-09-19 12 views
1

私は2つの機能を持っています。 find_host(...)freeにしたいメモリをmainの機能に割り当てました。Cで割り当てられたメモリを適切に解放する方法は?

char* find_host(char* filename){ 
    char *x = malloc(20); 
    sprintf(x, filename); 
    const char* t = "10"; 
    int len = (int) strcspn(filename, t); 
    x[len] = '\0'; 
    return ++x; 
} 

int main(){ 
    char *filename = "/CERN0/out_79.MERGE"; 
    char *word = find_host(filename); 
    free(word); 
    return 0; 
} 

しかしfree(word)は私を与える:

*** Error in `/home/ken/.CLion2016.2/system/cmake/generated/First-6a656bbe/6a656bbe/Debug/First': free(): invalid pointer: 0x00000000008b1011 *** 
======= Backtrace: ========= 
/lib/x86_64-linux-gnu/libc.so.6(+0x77725)[0x7f926862f725] 
/lib/x86_64-linux-gnu/libc.so.6(+0x7ff4a)[0x7f9268637f4a] 
/lib/x86_64-linux-gnu/libc.so.6(cfree+0x4c)[0x7f926863babc] 
/home/ken/.CLion2016.2/system/cmake/generated/First-6a656bbe/6a656bbe/Debug/First[0x4006e9] 
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0)[0x7f92685d8830] 
/home/ken/.CLion2016.2/system/cmake/generated/First-6a656bbe/6a656bbe/Debug/First[0x400579] 
======= Memory map: ======== 

どのようにすべきで正しくfreeメモリ?

+6

あなたは 'malloc'によって与えられたポインタを返して解放していません。あなたはそれを変更しました。与えられた正確な値だけを 'free'することができます。 –

+1

なぜ 'return ++ x'ですか? – jxh

+0

私は ''/CERN ''ではなく '' CERN ''を返すためです。 –

答えて

3

malloc()とその兄弟の呼び出しによって実際に返されたポインタ値に対してのみ、free()を呼び出すことができます。最初の文字をスキップしたいので、変更されたポインタを返すのではなく、バッファを読み込むときにスキップすることができます。

char* find_host(char* filename){ 
    size_t sz = strlen(filename); 
    char *x = malloc(sz); 
    snprintf(x, sz, "%s", filename + 1); 
    const char* t = "10"; 
    int len = (int) strcspn(filename, t); 
    x[len] = '\0'; 
    return x; 
} 
+0

それでも私にはエラーが出ます。たぶん 'x [len] = '\ 0''の場合? –

+1

@RomaKarageorgievich:エラーはありません:http://ideone.com/WhCqkB – jxh

+1

@RomaKarageorgievich [これについて](http://ideone.com/fdinTL)? – Michi

関連する問題