Если у вас есть
int main(int argc, char **argv) {
void *x = 0; // you could also say void *x = (void *)10;
printx(&x);
}
, вы объявляете x
в качестве указателя со значением 0
, и этот указатель живет в стеке, поскольку это локальная переменная. Теперь вы переходите к printx
адресу x
, а это означает, что с
memcpy(str, rec, 1000);
вы копируете данные из стека (или, фактически, из самого стека), в stack (потому что адрес указателя стека уменьшается при каждом нажатии). Исходные данные, вероятно, будут покрываться одной и той же записью таблицы страниц, поскольку вы копируете только 1000 байт, поэтому вы не получаете ошибки сегментации. Однако, в конечном счете, как уже было написано, мы говорим о неопределенном поведении.