В C синтаксис для передачи массива - это просто еще один способ сказать, что вы передаете указатель.Например:
void f(int a[])
это просто еще один способ сказать
void f(int *a)
Это специальный синтаксис в языке, и он предназначен для того, чтобы сделать параметры более самодокументированными, но этоможет также привести к путанице в ситуациях, подобных тому, что вы описываете.
В вашем случае объявление:
void disp(char words[][12],int size)
фактически говорит:
void disp(char (*words)[12],int size)
То есть словауказатель на массив из 12 символовА размер указателя в вашем случае составляет два байта.