Я работаю над проектом работы с файлами в C++. Я пытаюсь распечатать память и использование процессора моего текущего процесса в моей программе. Я получаю некоторую справочную помощь отсюда. Но она печатает адреса памяти, используемые этим процессом. Все, что я хочу, это получить значение использования памяти по этому адресу. Я пытался использовать через указатели, но не преуспел.
Здесь, делая это, он печатает адрес памяти процесса.
printf( "\tPeakPagefileUsage: 0x%08X\n",
pmc.PageFaultCount );
Это нормально, но затем я попытался напечатать значение по этому адресу. он дает исключение
unsigned int *jk;
*jk=pmc.PageFaultCount;
cout<<"\n"<<jk<<"\n";
Возможно, я использую неправильный тип данных для хранения адреса памяти в jk. Но я не уверен, в чем проблема. PLZ проведет меня, чтобы исправить это
Когда вы объявляете переменную jk
unsigned int *jk;
вы не инициализируете его, поэтому его значение неопределенно.
Затем, когда вы в следующей строке разыгрываете указатель, у вас есть неопределенное поведение.
Вы не должны разыгрывать jk
когда вы его назначаете.
Если pmc.PageFaultCount
сам по себе не является указателем, вам нужно использовать адрес-оператора &
чтобы получить указатель на него.
Однако, если вы хотите напечатать указатель на pmc.PageFaultCount
, вам не нужна временная переменная для его сохранения, просто распечатайте его:
std::cout << "Pointer to PageFaultCount = " << static_cast<void*>(&pmc.PageFaultCount) << '\n';
Что заставляет вас думать, что это указатель? PROCESS_MEMORY_COUNTERS
содержит подсчеты, а не адреса.
Используйте его так:
std::cout << "Page fault count: " << pmc.PageFaultCount << std::endl;
DWORD
и SIZE_T
, а не адреса. Смотрите документацию .
Вы никогда не выделяли 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++. Это два отдельных языка.
Я понятия не имею о C++
или C#
, buit в случае c
unsigned int *jk;
*jk=pmc.PageFaultCount;
даст segfault, потому что jk
здесь не инициализирован.
Вместо этого вы можете сделать
unsigned int *jk = malloc(sizeof(int));
*jk=pmc.PageFaultCount;
Проблема выглядит с помощью спецификатора формата:
printf( "\tPeakPagefileUsage: 0x%08X\n", pmc.PeakPagefileUsage );
Попробуйте использовать
printf( "\tPeakPagefileUsage: 0x%08d\n", pmc.PeakPagefileUsage );
Первый - это печать в шестнадцатеричном формате (базовый 16), но вы можете распечатать его в десятичном формате (base-10).
EDIT: или лучше использовать % 64d для печати 64-битного целого числа.
printf
вы должны использовать формат"%p"
и типvoid *
.