2016-03-25 2 views
0

Простите мое абсолютное отсутствие понимания здесь, просто погрузившись в C++. Поэтому я просто хотел посмотреть, могу ли я понять, как использовать putc для правильной записи символов в файл. Я хочу удостовериться, что я понимаю каждый шаг пути.При взгляде на адрес потока FILE, почему адрес отличается от адреса исходного указателя?

Теперь, глядя на адресные пространства, используемые, когда я изначально объявлял указатель на файл, и после передачи указателя на другую функцию, которая будет писать поток в файл, я заметил, что адресные пространства совершенно разные, даже по сравнению с адресным пространством исходной функции. Все еще пытаюсь полностью обернуть голову вокруг указателей, но трудно без какого-либо вмешательства сказать вам, где вы неправильно истолковываете вещи, и я знаю, что должен быть. Вот код, не против того, что я делаю это в Qtcreator. Ссылки помогают, но, пожалуйста, не просто скопируйте макароны на любую страницу информации на C++ по указателям. Я прочитал его.

#include <QCoreApplication> 
#include <stdio.h> 
#include <iostream> 
#include <fstream> 
using namespace std; 

void stream_writer(FILE & stream) 
{ 
    int  c1='A', 
      c2='B', 
      c3='C', 
      nl='\n'; 

    cout << &stream << endl; 
    putc(c1, &stream); 
    putc(nl, &stream); 
    cout << "written to testfile" << endl; 
    fclose(&stream); 
    putc(c2, stdout); 
    putc(c3, stdout); 
    putc(nl, stdout); 
} 

int main(int argc, char *argv[]) 
{ 
    QCoreApplication a(argc, argv); 

    FILE* testfile; 
    testfile = fopen("testfile.txt", "wt"); 
    if (testfile != NULL) 
    { 
     cout << &testfile << endl; 
     cout << testfile << endl; 
     stream_writer(*testfile); 
    } 
    else 
    { 
     cout << "Unable to open file\n"; 
    } 

    return a.exec(); 
} 

Пример моего выхода консоли после выполнения кода:

0x7ffff6aed478
0x138a200
0x138a200
написал TestFile
BC

+1

Стек и динамически назначенные адреса указателей могут сильно различаться, да. –

+2

Что вы находите странным? '& testfile' - это адрес вашей переменной' FILE * ', в то время как' testfile' и '& stream' - это адрес объекта' FILE', на который он указывает. (Вы также не передаете указатель на функцию, вы передаете ссылку.) – molbdnilo

+1

Почему вы когда-либо печатаете указатели? Какую информацию вы хотите извлечь? Как же вы пришли к указателям? В C++ вам нужны указатели * очень редко, поэтому ваше время было бы лучше потрачено на изучение других вещей. –

ответ

1

cout << &testfile << endl; печатает адрес файла FILE указатель себя: 0x7ffff6aed478

cout << testfile << endl; печатает адрес, указатель точки на: 0x138a200

памяти по адресу 0x7ffff6aed478 находится где хранится указатель FILE, и это имеет значение 0x138a200.

памяти по адресу 0x138a200 где выделяется реальный объект FILE, и здесь значения соответствуют данным в структуры FILE {...}

stream_writer(*testfile); Вы разыменования, чтобы получить объект FILE, передавая его ссылка на stream_writer(). cout << &stream << endl; Затем вы снова печатаете адрес того же объекта FILE. Таким образом, третья строка вывода является 0x138a200

+0

очень краткое описание. Спасибо! – pandabearit

+0

Добро пожаловать! Что касается того, почему один адрес имеет 12 шестнадцатеричных символов 0x7ffff6aed478, а другой 8: я точно не знаю, но я подозреваю, что функция fopen() как низкоуровневая функция выделяет объект FILE в 32-разрядном пространстве памяти (обратная совместимость с более старые системы, может быть?), тогда как указатель FILE, являющийся локальной переменной в стеке, заканчивается более «современным» 64-разрядным адресом – jrsmolley

2
void stream_writer(FILE & stream) 

Здесь вы получаете ссылку на FILE объекта.

cout << &stream << endl; 

Здесь вы печатаете адрес FILE объекта, с помощью ссылки.

FILE* testfile; 

Здесь вы объявляете указатель на FILE.

cout << &testfile << endl; 

Здесь вы печатаете значение указателя.

stream_writer(*testfile); 

Здесь передаем разыменовываются указатель в качестве ссылки на объект в вызываемой функции.

Было бы удивительно, если бы все они имели одинаковое значение.

Ваши ожидания неуместны.

Смежные вопросы