像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
建議你有什麼期望'無效F(INT X){X = 5;} INT主要(){INT I = 7; F(1); printf(「%d \ n」,i);返回0;}'打印? – immibis
@immibis正確,但我認爲傳遞指針的想法是,它可以讓你從另一個方法 – B1CL0PS
中改變那樣的東西,你需要像傳遞指針一樣將指針傳遞給'float ** array'。 – BLUEPIXY