Это будет простой вопрос, но поиск в 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 или даже обоих?