Я заметил, что это обычная идиома в C, чтобы принять указатель un-malloc
ed в качестве второго аргумента вместо того, чтобы возвращать указатель. Пример:указатель как второй аргумент вместо возвращаемого указателя?
/*function prototype*/
void create_node(node_t* new_node, void* _val, int _type);
/* implementation */
node_t* n;
create_node(n, &someint, INT)
Вместо
/* function prototype */
node_t* create_node(void* _val, int _type)
/* implementation */
node_t* n = create_node(&someint, INT)
Каковы преимущества и/или недостатки обоих подходов?
Спасибо!
EDIT Благодарим всех вас за ответы. Мотивы выбора 1 мне очень понятны (и я должен указать, что аргумент указателя для выбора 1 должен быть malloc'd вопреки тому, что я изначально думал).
Это. Возможность делать 'struct thing t; init_thing (&t); 'is nice. – dmckee
Если бы я хотел написать функцию для копирования связанного списка, мог бы я иметь прототип функции, например' void copy_list (node_t * new_head, node_t * original_head) '? Я думаю, мне нужно было бы malloc a новый узел для каждого в исходном списке и добавьте его в «конец» new_head (скопируйте val и тип, но приведите ему новое значение указателя 'node_t * next'). Это лучший способ сделать это? – Tyler
@ Tyler, рассмотрите 'copy_list (node_t ** new_head, const node_t * original_head)' как возможно предпочтительную подпись для этой функции (хотя этот особый случай _returning_ a 'node_t *' также является разумной возможностью). –