2017-01-19 1 views
-4

이 링크의 코드 ("How to get the starting/base address of a process in C++?")를 발견했습니다.메모리 주소 및 값 인쇄 방법

내가 그것을 실행하면, 그것은 나를 말합니다 ("Base Address : 400000") 이제 메모리 주소가 10 진수가 아닌 16 진수로 작동한다는 것을 알았습니다. 그래서 제가 물어볼 질문이 많습니다 :

  1. 어떻게 메모리 주소로 변환 할 수 있습니까?
  2. 어떻게 그 주소를 사용할 수 있습니까 & 값을 수정 하시겠습니까?
  3. 프로세스가 사용중인 모든 메모리 주소를 인쇄 할 수 있습니까?
  4. 주소로 표시된 값을 가져올 수 있습니까?

감사

+4

"이제 메모리 주소가 10 진수가 아닌 16 진수로 작동한다는 것을 알고 있습니다."- 사실이 아니며 간신히 이해할 수 있습니다. – immibis

+1

숫자를 나타내는 데 사용되는 밑수는 해당 숫자의 값과 관련이 없습니다. 0x10 16 및 이진수 10000은 동일한 값입니다. –

+0

이미 메모리 주소입니다. 표기법은'0x400000'입니다. 이 주소를 수정하기 위해서 당신은'5 ++'와 같이 상수를 쓸 수 없다. 그 안의 값을 출력하려면 역 참조 연산자'*'를 사용하십시오. : cout << * ptrToAddr; – Raindrop7

답변

0

어떻게 내가이 메모리 주소로 변환 할 수 있습니다?

숫자는 이미 메모리 주소를 나타내고 번역은 필요하지 않습니다.

어떻게 주소를 사용할 수 있습니까? & 값을 수정 하시겠습니까?

임베디드 시스템 분야에서는 포인터를 가져 와서 포인터에 할당합니다. 16 비트 레지스터 또는 메모리 주소에 액세스하려는 경우 uint16_t 포인터를 값에 할당합니다.
uint16_t * memory_pointer = (uint16_t *) 0x40000000;

그것은 프로세스가 사용하는 모든 메모리 주소를 인쇄 할 수있어?

운영 체제 문제입니다. 일부 운영 체제는 한 프로그램이 다른 프로세스의 메모리 영역에 액세스하지 못하도록 막으려합니다. "다른 프로세스"는 프로세스가 실행될 때 디스크로 스왑 될 수 있으며 프로세스가 수행하는 것과 동일한 메모리 영역을 사용합니다. 따라서 이것이 가능한지 여부는 플랫폼의 운영 체제에 따라 다릅니다.

주소로 표시된 값을 가져올 수 있습니까?

운영 체제 및 플랫폼에 따라 다릅니다. 일부 플랫폼은 특정 주소에 메모리가 있으며 해당 범위를 벗어나는 주소에 액세스하면 의 동작이 정의되지 않음입니다.

일부 운영 체제는 프로세스 외부의 메모리 (예 : 커널의 메모리)에 대한 액세스를 차단합니다. 이 경우 메모리에 액세스 한 결과는 운영 체제에 따라 다릅니다.

메모리에 액세스하는 방법은 포인터를 역 참조하는 것입니다. C++에서 바이트 액세스의 경우 uint8_t에 대한 포인터를 사용합니다.

+0

고마워요 @ 토마스 매튜스, 분명하고 포괄적입니다. Windows 10을 사용하고 있습니다 ... –