2015-10-04 56 views
0

我需要重新調整一個malloc'd C數組的大小。但是,我不應該使用realloc()(這是作業)。下面的代碼不斷拋出double free or corruption (out)更具體地說,這個函數似乎什麼也不做,因爲無論我是否調用它,程序的行爲都是一樣的。我覺得我可能錯過了一些基本的東西。誰能幫我嗎?非常感謝C:調整數組的大小沒有realloc()

void double_array_size(float *array, int *size) { 
    float *temp = NULL; 
    int i; 
    temp = (float *) malloc(*size * 2 * sizeof(float)); 

    for (i = 0; i < *size; i++) { 
    temp[i] = array[i]; 
    } 

    *size *= 2; 

    free(array); 
    array = temp; 
} 
+2

建議你有什麼期望'無效F(INT X){X = 5;} INT主要(){INT I = 7; F(1); printf(「%d \ n」,i);返回0;}'打印? – immibis

+0

@immibis正確,但我認爲傳遞指針的想法是,它可以讓你從另一個方法 – B1CL0PS

+1

中改變那樣的東西,你需要像傳遞指針一樣將指針傳遞給'float ** array'。 – BLUEPIXY

回答

2

像BLUEPIXY說,通過一個雙指針,或者如果你不想,更好這樣的:

float *double_array_size(float *array, int *size) { 
    float *temp = NULL; 
    int i; 
    temp = (float *) malloc(*size * 2 * sizeof(float)); 

    for (i = 0; i < *size; i++) { 
    temp[i] = array[i]; 
    } 

    *size *= 2; 

    free(array); 
    return temp; 
} 

,並提高你的代碼的性能,請不要使用for循環,使用memcpy代替:

temp = (float *) malloc(*size * 2 * sizeof(float)); 
memcpy(temp, array, sizeof *array * *size); 

你應該總是檢查返回值malloc和朋友。他們可能會返回NULL,根據您的代碼,如果您不希望代碼崩潰,則可能必須對此做出反應。

另一件事:如果您僅使用C,請不要投射malloc,並且我建議使用sizeof *var而不是sizeof(float),因爲您正在對該類型進行硬編碼。假設您必須更改數組的類型。如果你強調你的類型,你必須在任何地方改變類型,否則只有在聲明中,更少的工作和更少的錯誤。

有時你需要更多或更少不同類型的相同代碼。幸運的是,在C++中你有templates,在C你必須使用宏,如果你不想一遍又一遍基本上重複相同的代碼,例如:

#define DOUBLE_ARRAY_SIZE(type) \ 
    type *double_array_size_ ##type (type *array, size_t *size) {\ 
      type *temp; \ 
      temp = malloc(*size * 2 * sizeof *array);\ 
      if(temp == NULL)\ 
       return NULL;\ 
      memcpy(temp, array, sizeof *array * *size);\ 
      *size *= 2;\ 
      free(array);\ 
      return temp;\ 
     } 

而不是不同的編寫相同的代碼類型一遍又一遍,你可以做

DOUBLE_ARRAY_SIZE(int) 
DOUBLE_ARRAY_SIZE(double) 
DOUBLE_ARRAY_SIZE(record_t) 

void foo() 
{ 
    int *ints = malloc(...); 
    record_t *recs = malloc(...); 
    ... 
    new_ints = double_array_size_int(ints, ints_size); 
    new_recs = double_array_size_record_t(recs, recs_size); 
    .... 
} 

我知道很多人會說不使用macros,他們是邪惡,他們是那種真正的,但使用它們明智地幫助您更謝謝你的想法。你應該嘗試儘量減少數據類型的原因之一。

//編輯我的微距段,chux與size_t

+0

輕微:'size_t * size'而不是'int * size'。 – chux

+0

是的,很好的建議,我錯過了 – Pablo

+0

不要把'malloc'和朋友的結果放在C中! – Olaf

2

一個與此代碼的問題是,參數調用 - 值,所以你改變array只有本地複製和內存泄漏。程序其餘部分的值永遠不會更新。你想要做的是return重新分配的數組。