Я изучаю исходный код (написанный на C) bkhive - утилиты для сброса загрузочного ключа SysKey из системного куста Windows NT / 2K / XP - и хотел бы узнать, есть ли какое-то обоснование для чего-либо оригинальный автор сделал: передать указатель на struct
в функцию и затем вернуть тот же указатель. Вот соответствующий исходный код:
В main()
есть вызов, который выглядит следующим образом:
struct hive h;
char *root_key;
// Do some stuff to init
_RegGetRootKey(&h, &root_key)
Какие звонки:
int _RegGetRootKey(struct hive *h, char **root_key)
{
nk_hdr *n;
n = (nk_hdr*) malloc(sizeof(nk_hdr));
/* ************************************************
* RELEVANT FUNCTION CALL
* Why pass n as a parameter and use return value?
* ************************************************/
n = read_nk(n, h, 0x1020);
if (n->id == NK_ID && n->type == NK_ROOT)
{
*root_key = (char *) malloc(n->name_len + 1);
strncpy(*root_key, n->key_name, n->name_len);
(*root_key)[n->name_len] = 0;
free(n);
return 0;
}
free(n);
return -1;
}
Какие звонки:
nk_hdr* read_nk(nk_hdr *nk, struct hive *h, int offset)
{
memcpy(nk, h->base + offset + 4, sizeof(nk_hdr));
nk->key_name = (h->base + offset + 4 + 76);
return nk;
}
Итак, какова цель передачи указателя struct
и его возврата? Может ли функция ничего не возвращать и использовать n
после вызова функции?