Вы делаете это неправильно по нескольким пунктам:
- Вы пытаетесь установить переменную
handle->ab
, но handle
- это void *
, а не указатель типа структуры.
- Вам нужно показать свой звонок, но могут возникнуть проблемы - почему вы думаете, что аргумент
void *
- хорошая идея?
- Вы хотите выделить структуры, поэтому операнды
sizeof()
должны быть xyz_t
, а не xyz_t *
; повторите для abc_t
.
Вы, вероятно, следует использовать:
int Lookup(const char *lookup, xyz_t **handle)
{
...
*handle = (xyz_t *)malloc(sizeof(xyz_t));
(*handle)->ab = (abc_t *)malloc(sizeof(abc_t));
...
}
Не забудьте проверить результат malloc()
.
Есть те, кто заманит вас за использование бросков на malloc()
. Я не буду.Когда я узнал C (давным-давно, задолго до того, как был стандарт C), на машине, где значение int *
для адреса не было таким же битовым шаблоном, как адрес char *
для того же места в памяти, где должно было быть malloc()
объявленный char *malloc()
, или весь ад сломался, броски были необходимы. Но - и это главная проблема, которую беспокоят люди. Очень важно, чтобы вы компилировали с такими параметрами компилятора, чтобы при вызове функции без прототипа в области видимости вы получили ошибку компиляции или предупреждение о том, что вы обратите внимание. Вызывает беспокойство то, что если у вас нет объявления для malloc()
в области видимости, вы получите неверные результаты от использования литого, который компилятор будет диагностировать, если вы этого не сделаете.
В целом, я думаю, вам следует отделить свой код поиска от кода «create xyz_t
» - ваша функция выполняет два задания, и это усложняет интерфейс вашей функции.
xyz_t *Create_xyz(void);
int Lookup(const char *lookup, const xyz_t *handle);
'handle' является указатель void и не имеет информации о типе, это только адрес в памяти, поэтому вызов 'handle-> ab' не будет работать. –
Я хочу напечатать набросок на xyz_t и получить доступ к ab –
Есть ли какая-то особая причина, по которой вы не можете просто изменить 'Lookup', чтобы взять' xyz_t *' вместо 'void *'? –