2013-06-04 1 views
0

txt 파일에 메모리 위치 주소가 있습니다. 파일에서 주소를 읽고 그 주소에 저장된 값을 사용하고 싶습니다. 다음은 내가 수행 한 작업입니다.저장된 특정 메모리 주소의 포인터

char line[10]; 
FILE *f; 
f=fopen("p:\\address.txt", "r"); 
fgets(line,10,f); 

파일에 주소 0x12ff30이 들어 있습니다. 나는 이것을 char 배열 라인에 저장했다. 주소에 이중 값 (0x12ff30에서 8 바이트)이 들어 있습니다. 이제 포인터를 만들고 사용하여 그 주소에 저장된 값을 얻는 방법은 무엇입니까?

감사합니다.

+1

정말로 하시겠습니까? 일반적으로 말하자면, 임의의 메모리 위치에 액세스하여 의미있는 행동을 취할 수는 없습니다. –

+0

@OliCharlesworth 안녕하세요! 사실 나는 실시간으로이 메모리 위치에 데이터를 쓰는 다른 소프트웨어를 실행 중이다. 따라서 나는이 위치에 접근하여 그 가치를 얻고 싶다고 확신한다 :) – user2438252

+5

정말로 이것을하고 싶지는 않다. 프로그램이 메모리 공간을 공유한다면 거기에 포인터를 가져 오는 더 좋은 방법, 예를 들어 전역 변수가 많이 있습니까? 적어도 공유 메모리와 같은 IPC http://en.wikipedia.org/wiki/Interprocess_communication을 살펴볼 필요가 있습니다. 프로세스간에 통신하는 방법으로 파일 시스템을 사용하지 마십시오! ... –

답변

0

해당 주소에 int 값이 있다고 가정 해 보겠습니다. 또한 주소를 액세스 할 수 있다고 가정 해 봅시다. [주소가 유효하지 않을 때마다 파일을 읽을 때] 충돌하지 않습니다. 그런 다음
,

void *p; 
sscanf(line, "%p", &p); 
double value = *(double *)p; 

//use value for other operations. 
+0

'이중'으로 스캔하고 있습니까? –

+0

나는 즉시 -1을주지는 않겠지 만 당신의 대답은 다음과 같은 문제가 있습니다 :'% x' 형식 지정자는'unsigned long'이 아닌'unsigned int' 인수를 기대합니다. '% p' 지정자 (그리고'void *')가 더 적절할 것입니다.또한 포인터를 올바르게 역 참조하지 않고 대신'value'를'p'에 대한 포인터를 포함하도록 설정합니다. – Hasturkun

+0

@Hasturkun 가능한 경우 내 대답을 편집하거나 자신의 대답을 줄 수 있습니다. –

5

이 작업을 수행하지 마십시오. IPC, 즉 프로세스 간 통신을 사용하십시오.

거의 모든 최신 컴퓨터 시스템에서 두 가지 프로세스가있는 경우 자체 가상 주소 공간을 갖게됩니다. 한 프로세스의 포인터는 다른 프로세스에서 의미가 없습니다.

공유 메모리 나 메시지 대기열과 같은 IPC 방법을 사용하는 것이 좋습니다 (일부 링크의 경우 http://en.wikipedia.org/wiki/Inter-process_communication 참조). 사용할 수있는 많은 방법이 있습니다. double 값을 포인터로 사용하지 말고이 값을 움직여야합니다. 두 프로그램 모두 해당 더블에 대한 동시 액세스가 필요한 경우 어쨌든 어떻게 동기화 할 것인지 생각해야합니다.

IPC 용 파일 시스템을 사용하지 마십시오. 정말 끔찍한 생각입니다.

+0

안녕하세요! 이것을 게시 한 후에 나는 포인터의 인터 프로세스 제한을 깨달았습니다. 그 점을 지적 해 주셔서 대단히 감사합니다. 마지막으로 의심되는 점은 malloc()을 사용하면 같은 결과가 발생한다는 것입니다. – user2438252

+0

또한 프로세스 간 통신을 위해 공유 메모리를 사용하는 유용한 자습서/예제를 안내해 줄 수 있습니까? 고맙습니다. – user2438252

+0

이것은 괜찮아 보입니다 - http://www.cs.cf.ac.uk/Dave/C/node27.html. 나는 당신의 각각의 프로그램이 무엇을하는지 전혀 모르기 때문에 공유 된 기억이 당신에게 옳은지 아닌지를 모른다. 보통 프로세스 간 통신을 위해 메시지 전달 스키마를 더 많이 사용합니다.이 경우 메시지 대기열 또는 TCP/UDP 소켓을 사용합니다. TCP/UDP의 이점은 두 프로세스가 물리적으로 분리 된 시스템에있을 수 있지만 TCP 및 UDP에는 각각 장단점이 있습니다. (인생에서의 많은 문제는 절충 적이며, 종종 올바른 대답이 없습니다!) –

0

16 진수 값을 갖는 문자열을 int로 변환하겠습니까? 내가

그래서 예를

#include"stdio.h" 
#include"stdlib.h" 
int main() 
{ 
    char buff[] = "0x12ff30"; 
    int num = strtol(buff,NULL,16); 
    printf("%x\n", num); // this is 12ff30 

    return 0; 

}를 가지고, 당신이 시도 할 수 있습니다.

char line[10]; 
FILE *f; 
f=fopen("p:\\address.txt", "r"); 
fgets(line,10,f); 
int address = strtol(line,NULL,16); 
관련 문제