Когда я объявил переменную
char buf[512];
Что значит &buf?
Похоже на buf:
printf(" buf : %p %p\n", (void *) buf, (void *) &buf);
печатает:
buf : 0x7ffda6053fe0 0x7ffda6053fe0
Мало того, что это недопустимый C, если вы хотите распечатать значение указателя в printf() и друзьях, %d не является правильным спецификатором формата ... вернитесь и прочитайте документацию по функции. И посмотрите, сможете ли вы при этом найти что-нибудь о распаде указателя.
Вы имеете в виду char buf [512]; ?
(c-faq.com/aryptr/index.html может быть полезно прочитать)
Да, я имею в виду char buf [512].





это адрес 1-го элемента в массиве (т. е. адрес buf [0]) по сравнению с адресом самого массива (т. е. buf). Неудивительно, что они равны.
Адрес такой же, потому что массив распадается на указатель на первый элемент при передаче, с другой стороны, оператор адресации & принимает адрес массива, адрес первого элемента и адрес самого массива. одинаковы.
Используйте %p вместо %d для печати адресов:
printf(" buf : %p %p\n", (void *)buf, (void *)&buf);
Что означает
char[512] buf? Это опечатка?