2011-11-29 53 views
5

它真正使用realloc的一些建議帖子更具體地說,如果我可以利用它來簡化我現有的代碼。本質上,下面做了什麼,它動態分配一些內存,如果我超過了256,那麼數組的大小需要增加,所以我malloc一個臨時數組,2倍大小,memcpy等(見下文)。在使用realloc的,性方面用C

我只是想知道,如果可能的realloc在下面的代碼中使用,簡化它,任何建議,示例代碼,或者對如何實現它甚至暗示是非常感謝!

乾杯。

void reverse(char *s) { 
char p; 

switch(toupper(s[0])) 
{ 
    case 'A': case 'E': case 'I': case 'O': case 'U': 
     p = s[strlen(s)-1]; 
     while(p >= s) 
      putchar(p--); 
     putchar('\n'); 
     break; 
    default: 
     printf("%s", s); 
     break; 
} 
printf("\n"); 
    } 

    int main(void) { 
char c; 
int buffer_size = 256; 
char *buffer, *temp; 
int i=0; 

buffer = (char*)malloc(buffer_size); 
while (c=getchar(), c!=' ' && c!='\n' && c !='\t') 
{ 
    buffer[i++] = c; 
    if (i >= buffer_size) 
    { 
     temp = (char*)malloc(buffer_size*2); 
     memcpy(temp, buffer, buffer_size); 
     free(buffer); 
     buffer_size *= 2; 
     buffer = temp; 
    } 
} 
buffer[i] = '\0'; 
reverse(buffer); 

return 0; 

}

+1

音符的風格:你應該更喜歡** **不投malloc'的'的返回值。 –

+1

而'reverse'應該將參數作爲'const char *'。 –

回答

11

是一個簡短的回答。下面是它會怎樣看:

if (i >= buffer_size) 
{ 
    temp = realloc(buffer, buffer_size*2); 
    if (!temp) 
     reportError(); 
    buffer_size *= 2; 
    buffer = temp; 
} 

請注意,您仍然需要使用一個臨時指針持有realloc()的結果;如果分配失敗,您仍然有指向仍然有效的現有緩衝區的原始buffer指針。

1

realloc的是相當多的,你要尋找什麼 - 你可以像更換if (i >= buffer_size)內部的整個區塊:

buffer = (char*)realloc(buffer, buffer_size*2); 
buffer_size *= 2; 

注意,這忽略了錯誤條件(如果從realloc返回的是NULL);捕捉這種情況留給讀者。

1

是,realloc可以用來稍微簡化代碼。如果你不感興趣的錯誤處理,那麼這個:

char *tmp = malloc(size*2); 
memcpy(temp, buffer, size); 
free(buffer); 
buffer = tmp; 

基本上是相同的:

buffer = realloc(buffer, size*2); 

如果你有興趣的錯誤處理(你可能應該是)那麼你將需要檢查返回值爲NULL。您的原始代碼也是如此。

+1

-1。如果realloc失敗(通過返回NULL),您已經失去了對原始塊的引用。 –

+1

@Graham:我明確地說過「如果你對錯誤處理不感興趣」。 OP在其原始代碼中也沒有任何錯誤處理。 –

+1

這個「錯誤處理」不僅僅是像檢查'std :: cin >> n'這樣的一些小孩玩法;這一個在這裏可能會,並將幾乎肯定會導致UB ... –

1

是,簡化你的代碼,你可以更換

if (i >= buffer_size) 
{ 
    temp = (char*)malloc(buffer_size*2); 
    memcpy(temp, buffer, buffer_size); 
    free(buffer); 
    buffer_size *= 2; 
    buffer = temp; 
} 

if (i >= buffer_size) 
    buffer = realloc(buffer, buffer_size *= 2); 

這並沒有考慮到錯誤校驗,所以您需要檢查,以確保realloc沒有按」返回NULL

+1

'realloc'可能會返回'NULL',給你一個瞬間不可恢復的泄漏。 –

+2

-1。如果realloc失敗(通過返回NULL),您已經失去了對原始塊的引用。 –

+2

@GrahamBorland我說你可以使用該代碼替換他的原代碼。他沒有在那裏檢查'NULL',所以我也沒有檢查。但是我添加了一個註釋來提及它。 –