2017-02-08 12 views
-1

В псевдокоде, я хотел бы заменить:Succinct динамическое выделение памяти в C

ra    = (double *) realloc(ra, Num*sizeof(*ra)); 
dec   = (double *) realloc(dec, Num*sizeof(*dec)); 
zobs   = (double *) realloc(zobs, Num*sizeof(*zobs)); 
M_B   = (double *) realloc(M_B, Num*sizeof(*M_B)); 

с

например, mem_allocate (& ра, & Декабрь, & ZOBS, & M_B)

где

mem_allocate(arg1, arg2,..., arg4){ 

for argi in arg1 to arg4{ 
    argi = (double *) realloc(argi, Num*sizeof(*argi)) 

} 

} 
+3

Как функция знает 'Num'? Это постоянный? Разве не лучше было бы передать это как параметр? – Lundin

+0

Вы не можете перебирать обычные аргументы в C. Однако вы можете написать это как функцию varargs. Это может быть более гибким, чем функция для фиксированного количества аргументов. –

+3

Если вы * переписываете его как функцию, тогда добавьте лучшую обработку ошибок. В частности, не теряя адрес старого блока памяти, когда 'realloc' возвращает нулевой указатель. – StoryTeller

ответ

1

Для полноты моего предыдущего комментария, пример может служить

#include <stdio.h> 
#include <stdlib.h> 
#include <stdbool.h> 

bool mem_allocate (double *vars[], size_t N_vars, size_t newWidth) 
{ 
    double *temp; 

    printf("\n"); 

    for (size_t i=0; i<N_vars; i++) 
    { 
     temp = realloc(vars[i], newWidth*sizeof(*temp)); 

     if (temp != NULL) 
     { 
      printf ("temp: %p\n", (void *)temp); 
      vars[i] = temp; 
     } 
     else 
     { 
      return false; 
     } 
    } 

    printf("\n"); 

    return true; 
} 

int main (void) 
{ 
    double *var1 = malloc(sizeof(*var1)); 
    double *var2 = malloc(sizeof(*var2)); 
    double *var3 = malloc(sizeof(*var3)); 
    double *var4 = malloc(sizeof(*var4)); 

    printf ("var1: %p\n", (void *)var1); 
    printf ("var2: %p\n", (void *)var2); 
    printf ("var3: %p\n", (void *)var3); 
    printf ("var4: %p\n", (void *)var4); 

    double *vars[4]; 

    vars[0] = var1; 
    vars[1] = var2; 
    vars[2] = var3; 
    vars[3] = var4; 

    if (mem_allocate (vars, sizeof(vars)/sizeof(vars[0]), 200) == true) 
    { 
     var1 = vars[0]; 
     var2 = vars[1]; 
     var3 = vars[2]; 
     var4 = vars[3]; 

     printf ("var1: %p\n", (void *)var1); 
     printf ("var2: %p\n", (void *)var2); 
     printf ("var3: %p\n", (void *)var3); 
     printf ("var4: %p\n", (void *)var4); 
    } 

    return 0; 
} 

Изменение varx внутри функций mem_allocate означало бы реализацию 3 звезды, что я действительно не люблю.

Очевидно, что все malloc должно быть проверено.

+1

На самом деле это самое простое решение. Я удалю свой ответ в пользу этого. – Lundin

+1

Почему 'sizeof (sometype)' вместо 'sizeof * ptr'? – Deduplicator

+0

@Deduplicator Не настоящая причина, но функция принимает только двойные указатели. BTW Я обновляю ответ: это лучше для управления кодом. – LPs