Код открытия файла на C. Мне нужно объяснение, почему этот код выдает разные выходные данные при запуске несколько раз

#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 является a FILE * . Адрес fp — это расположение стека. Диапазон адресов стека, а также другие сегменты памяти рандомизируются во многих современных системах с помощью рандомизации компоновки адресного пространства (ASLR) в качестве функции безопасности.

3. BT я не знаю о e режиме, как в "we"

4. @h0r53 это различие между расположением переменной указателя файла и тем, на что она указывает.

5. @h0r53 «printf в этом экземпляре печатает местоположение буфера, содержащего данные temp.txt ,» : нет, это неправильно. p указывает на некоторую внутреннюю структуру, которую библиотека использует для чтения данных из открытого файла. Детали внутренней структуры не имеют значения, и они могут варьироваться от реализации к реализации.

Ответ №1:

Это связано с рандомизацией расположения адресного пространства. FILE Структура, на которую fopen() возвращается указатель, находится в памяти кучи процесса, а ASLR означает, что расположение кучи будет отличаться при каждом запуске программы.

Комментарии:

1. Но даже без ASLR не гарантируется, что программа всегда выводит одно и то же значение, не так ли?

2. Не гарантируется, но вероятно.