У меня следующая ситуация:усечения указателей при литье
- функция list_split возвращает (list_t *)
- я называю list_split и ввергнуть возвращение к (аннулируются **)
- Функция возвращает 11054a2b8 но переменная, которая принимает значение получает 1054a2b8
- Таким образом, кажется, что (list_t *) имеет 8 байт, но (пустота *) га всего 4 байта
Вот код:
typedef struct node_s *list_t;
typedef struct node_s {
void *el;
list_t tail;
} node_t;
list_t *list_split(list_t list, void **head)
{
if (list) {
*head = list->el;
printf(" &list->tail = %p", &list->tail));
return &list->tail;
}
else {
*head = (void *)NULL;
return (list_t *)NULL;
}
}
foo()
{
void **list;
list = (void **)list_split(*list, &ent);
printf("list = %p", list));
}
И выход:
&list->tail = 11054a2b8
list = 1054a2b8
У вас есть возможное неопределенное поведение в вашем коде: вы вызываете 'list_split' с' * list' в качестве первого аргумента, но 'list' является неинициализированным указателем (на указатель), поэтому разыгрывание его приведет к неопределенному поведению. Надеюсь, вы правильно его инициализируете в своем реальном коде? Может быть, вы должны отредактировать свой вопрос, включив в него [короткий и автономный пример] (http://sscce.org/)? –
Почему бы вам просто не напечатать sizeof (void *) и sizeof (list_t *)? –
Если ваш void * равен 4 байтам, тогда ваш list_t * должен быть 4 байта. – 51k