#c #file #memory-address
#c #файл #адрес памяти
Вопрос:
#include <stdio.h>
#include <stdlib.h>
int main(void){
FILE *fp = fopen("temp.txt", "we");
printf("%pn", fp);
return 0;
}
этот код выдает следующие разные выходные данные:
0x19ee260
0x1ef9260
0xbde8260
.
.
.
Мне нужно объяснение, касающееся памяти.
Комментарии:
1. Почему вы ожидаете, что он будет выдавать один и тот же результат каждый раз?
2.
fp
является aFILE *
. Адресfp
— это расположение стека. Диапазон адресов стека, а также другие сегменты памяти рандомизируются во многих современных системах с помощью рандомизации компоновки адресного пространства (ASLR) в качестве функции безопасности.3. BT я не знаю о
e
режиме, как в"we"
4. @h0r53 это различие между расположением переменной указателя файла и тем, на что она указывает.
5. @h0r53 «printf в этом экземпляре печатает местоположение буфера, содержащего данные temp.txt ,» : нет, это неправильно.
p
указывает на некоторую внутреннюю структуру, которую библиотека использует для чтения данных из открытого файла. Детали внутренней структуры не имеют значения, и они могут варьироваться от реализации к реализации.
Ответ №1:
Это связано с рандомизацией расположения адресного пространства. FILE
Структура, на которую fopen()
возвращается указатель, находится в памяти кучи процесса, а ASLR означает, что расположение кучи будет отличаться при каждом запуске программы.
Комментарии:
1. Но даже без ASLR не гарантируется, что программа всегда выводит одно и то же значение, не так ли?
2. Не гарантируется, но вероятно.