2015-11-25 61 views
1

這個應該很快,我想。不能釋放一個Malloc'd字符串

編輯:這是我的CS113類。我只需要釋放所有的內存。如果Valgrind發現任何內存泄漏,我會失分。 :P

無論如何,我發現它顯然只是要求我在Main中釋放與zero_pad的返回值有關的東西。一旦我這樣做,它運作良好。如果我知道如何,我會將這篇文章標記爲「完整」。

char *zero_pad(struct cpu_t *cpu, char *string) 
{ 
    char *zero_string = malloc(cpu->word_size + 1); 
    int num_zeros = ((cpu->word_size) - strlen(string)); 
    int i; 

    for(i = 0; i < num_zeros; i++) 
    { 
     zero_string[i] = '0'; 
    } 

    return strncat(zero_string, string, strlen(string));  
} 

我需要釋放zero_string,因爲我分配了它。但是,我不知道如何。 如果我在返回之前釋放它,那麼我已經丟失了該數據並且無法將其返回。如果我嘗試釋放它後,該功能已經返回,因此不能繼續釋放它。

我試圖使用strcpy將zero_string中的字符串複製到一個新的字符串中,但我一直在做錯,因爲我剛剛結束了一個大混亂。

那麼,你們都在想什麼?

+4

API文檔提及調用者負責免費返回值是很常見的。 – 2015-11-25 22:40:13

+0

我不知道這意味着什麼人。這裏很新,這是我第一個CS113學期。儘管如此,仍然喜歡它! –

+0

'int num_zeros =((cpu-> word_size) - strlen(string));'包含一個有符號無符號錯誤 –

回答

0

什麼是cpu->word_size?你確定無論如何cpu->word_size >= strlen(string)

無論如何,返回的緩衝區是mallocated的,因此調用者有責任釋放它。如果您知道所需的最大大小,另一種可能性是使用靜態變量。這是代碼。

#define MAX_SIZE 128 /* adjust this */ 
char *zero_pad(struct cpu_t *cpu, char *string) 
{ 
    static char zero_string[MAX_SIZE]; 
    int num_zeros = ((cpu->word_size) - strlen(string)); 
    int i; 

    for(i = 0; i < num_zeros; i++) 
    { 
     zero_string[i] = '0'; 
    } 

    strcpy(zero_string + i, string); 
    return zero_string; 
} 

顯然,調用者應該被告知返回的緩衝區始終是相同的(調用者有必要時,例如使用strdup()後來free()複製返回的緩衝區)。

相關問題