Вы разыменовываете указатель на недопустимую память, food
.
Строка:
struct foo * food;
объявляет food как указатель на struct foo.Но так как вы не инициализируете указатель, он указывает на неопределенную область памяти, которой вы не владеете.Вы можете просто выделить в стеке (заметьте, я изменил тип еды):
struct foo food;
food.cat = cat;
food.dog = dog;
printf("cat meows %i\n", food.cat);
printf("dog barks %i\n", *(food.dog));
printf("time for foo!\n");
bar(&food);
или использовать malloc
(сохраняя тип как struct foo *):
struct foo * food = malloc(sizeof(struct foo));
if(food == NULL)
perror("Failed to allocate food.");
Позже вы должны освободить его (хотя в этом случае это не имеет большого значения):
free(food);
Есть другие проблемы с программой (например, параметр void *), но это касается памятинарушение.