2016-09-19 78 views
1

我有兩個功能。在find_host(...)我分配了要在main函數free的內存。如何正確釋放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'給出的指針。你已經改變了它。你只能「釋放」你獲得的確切價值。 –

+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