Существует большая разница между char buf [64] и char * buf. * 1001 *
Я предлагаю вам узнать разницу, напечатав размер этих двух объявлений.
EX:
char *r;
char buf[64];
printf(" Size of array :%d pointer :%d\n", sizeof(buf), sizeof(r));
char * r; является чистой декларацией указателя, который содержит адрес переменной типа char.
char * r - это указатель на символ, и сейчас он указывает на ненужное значение.
char buf [64], это буфер символов длиной 64 байта, и buf указывает на первый символ.
char * r указывает неизвестное / нежелательное значение. Перед использованием такого подхода вы должны выделить память.
char *r = (char *) malloc(32);
or
char buf[64];
char *r;
r = buf;
---> Теперь 'r' указывает на buf, у которого уже есть выделенная память.
Теперь вы можете понять разницу.