Получить значения по адресам памяти

0

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

Здесь, делая это, он печатает адрес памяти процесса.

 printf( "\tPeakPagefileUsage: 0x%08X\n", 
                  pmc.PageFaultCount );

Это нормально, но затем я попытался напечатать значение по этому адресу. он дает исключение

unsigned int *jk;
*jk=pmc.PageFaultCount;
        cout<<"\n"<<jk<<"\n";

Возможно, я использую неправильный тип данных для хранения адреса памяти в jk. Но я не уверен, в чем проблема. PLZ проведет меня, чтобы исправить это

  • 0
    в ритуале c ++ мы тоже делаем то же самое int m = 9; int * b; б = & м; соиЬ << * б; , Эта вещь дает мне точное значение по адресу, но когда я пытался с приведенным выше кодом, он выдает ошибку, поэтому я пошел с * jk = pmc.PageFaultCount
  • 1
    Чтобы напечатать указатель с помощью printf вы должны использовать формат "%p" и тип void * .
Показать ещё 3 комментария
Теги:
memory

5 ответов

1

Когда вы объявляете переменную jk

unsigned int *jk;

вы не инициализируете его, поэтому его значение неопределенно.

Затем, когда вы в следующей строке разыгрываете указатель, у вас есть неопределенное поведение.

Вы не должны разыгрывать jk когда вы его назначаете.

Если pmc.PageFaultCount сам по себе не является указателем, вам нужно использовать адрес-оператора & чтобы получить указатель на него.


Однако, если вы хотите напечатать указатель на pmc.PageFaultCount, вам не нужна временная переменная для его сохранения, просто распечатайте его:

std::cout << "Pointer to PageFaultCount = " << static_cast<void*>(&pmc.PageFaultCount) << '\n';
1

Что заставляет вас думать, что это указатель? PROCESS_MEMORY_COUNTERS содержит подсчеты, а не адреса.

Используйте его так:

std::cout << "Page fault count: " << pmc.PageFaultCount << std::endl;
  • 0
    он содержит адреса памяти, эти адреса должны иметь некоторые значения
  • 0
    @ArsalanSherwani Структура содержит DWORD и SIZE_T , а не адреса. Смотрите документацию .
Показать ещё 3 комментария
1

Вы никогда не выделяли jk (ужасное имя). Вы можете использовать автоматическое хранилище:

unsigned int jk=pmc.PageFaultCount;

Или вы можете выделить память самостоятельно:

unsigned int *jk=new unsigned int;             // or malloc for C
*jk=pmc.PageFaultCount;


// and sometime later
delete jk;                                     // or free in C

Как побочное замечание, не путайте C с C++. Это два отдельных языка.

  • 1
    Зачем динамически выделять целое число ??
  • 0
    Не спрашивай меня, это его фетиш!
0

Я понятия не имею о C++ или C#, buit в случае c

unsigned int *jk;
*jk=pmc.PageFaultCount;

даст segfault, потому что jk здесь не инициализирован.

Вместо этого вы можете сделать

unsigned int *jk = malloc(sizeof(int));
*jk=pmc.PageFaultCount;
  • 2
    Почему, черт возьми, malloc целое число ??
  • 0
    @NeilKirk, чтобы сказать ОП, где именно была ошибка.
0

Проблема выглядит с помощью спецификатора формата:

printf( "\tPeakPagefileUsage: 0x%08X\n", pmc.PeakPagefileUsage );

Попробуйте использовать

printf( "\tPeakPagefileUsage: 0x%08d\n", pmc.PeakPagefileUsage );

Первый - это печать в шестнадцатеричном формате (базовый 16), но вы можете распечатать его в десятичном формате (base-10).

EDIT: или лучше использовать % 64d для печати 64-битного целого числа.

  • 0
    Или используйте C ++ в виде тегов и позвольте компилятору выяснить, сколько битов существует.
  • 0
    Для регистрации, записи в консоль, отправки по проводам, функции семейства printf все еще лучший выбор!
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню