Терминология при инициализации структур C

Это будет простой вопрос, но поиск в Google, похоже, не дает мне ответа. Как я понимаю в языке C, у нас есть два способа инициализировать объект foo, когда foo - это структура. Взгляните на приведенный ниже код для примера

typedef struct foo
{
   int var1;
   int var2;
   char* var3;
}foo;

//initializes and allocates a foo
foo* foo_init1(int v1,int v2,const char* v3)
{
   if(..some checks..)
      return 0;
   foo* ret = malloc(sizeof(foo));

   ret->var1 = v1;
   ret->var2 = v2;
   ret-var3 = malloc(strlen(v3)+1);
   strcpy(ret->var3,v3);

   return ret;
}

// initializes foo by ... what? How do we call this method of initialization?
char foo_init2(foo* ret,int v1,int v2, const char* v3)
{
   //do some checks and return false
    if(...some checks..)
         return false//;assume you defined true and false in a header file as 1 and 0 respectively
   ret->var1 = v1;
   ret->var1 = v1;
   ret->var2 = v2;
   ret-var3 = malloc(strlen(v3)+1);
   strcpy(ret->var3,v3);

   return true;
}

Итак, мой вопрос таков. Как мы относимся к этим различным методам инициализации на языке C? Первый возвращает инициализированный указатель на foo, поэтому его легко использовать, если вы хотите, чтобы объект foo находился в куче:

foo* f1 = foo_init1(10,20,"hello");

Но второй требует foo .. что? Посмотрите на код ниже.

foo f1;
foo_init2(&f1,10,20,"hello");

Итак, второй метод упрощает инициализацию объекта в стеке, но как это назвать? Это в основном мой вопрос, как относиться ко второму способу инициализации.

Первый выделяет и инициализирует указатель на foo. Второй инициализирует foo ... чем? Ссылка?

В качестве дополнительного вопроса, как вы, ребята, работаете при кодировании на C? Определяете ли вы использование создаваемого вами объекта и тем самым определяете, нужна ли вам инициализирующая функция типа 1, 2 или даже обоих?

6
задан Lefteris 23 February 2012 в 04:07
поделиться