Для первого вопроса вы создаете указатель h
без его инициализации, а затем немедленно пытаетесь разыменовать его с помощью h->f.b
.
Для второго вы должны использовать g*
, а не g
:
#include <stdio.h>
int d (void) { return 0; }
int i (void) { return 7; }
struct a { int(*b)(void); } c = {d};
typedef struct e { struct a f; } g;
int main (void) {
struct e *h = (g*)malloc (sizeof (g));
h->f.b = i;
printf ("%d\n", h->f.b());
}
Это потому, что g
- это структура, а не указатель на структуру. Код выше выводит 7
, как и ожидалось.