2013-06-04 7 views
0

У меня есть адрес ячейки памяти в txt-файле. Я хочу прочитать адрес из файла и использовать значение, хранящееся по этому адресу. Вот что я сделал:Указатель на сохраненный адрес памяти

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

Файл содержит адрес 0x12ff30. Я сохранил это в строке массива char. Адрес содержит двойное значение (8 байт от 0x12ff30). Теперь, как я могу создать и использовать указатель, чтобы получить значение, хранящееся по этому адресу?

спасибо.

+1

Вы уверены, что это то, что вы хотите сделать? Вообще говоря, вы не можете получить доступ к произвольным местам памяти и получить осмысленное поведение. –

+0

@OliCharlesworth Эй! На самом деле я запускаю другое программное обеспечение, которое записывает данные в эту ячейку памяти в реальном времени. Поэтому я уверен, что хочу получить доступ к этому местоположению и получить это значение :) – user2438252

+5

Вы действительно не хотите этого делать. Если ваши программы обмениваются памятью, тогда есть БОЛЬШЕ лучшие способы получить указатель там, скажем, глобальную переменную? По крайней мере вам нужно изучить IPC http://en.wikipedia.org/wiki/Inter-process_communication, например, разделяемую память. ПОЖАЛУЙСТА, не используйте файловую систему как способ связи между процессами! ... –

ответ

0

Предположим, что в этом адресе указано значение int. Также предположим, что адрес доступен [когда вы читаете файл в другой раз, когда адрес может быть недействительным], и он не будет аварийно завершен.
Затем

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

//use value for other operations. 
+0

Вы просматриваете «двойник»? –

+0

Я не дам вам -1 сразу, но ваш ответ имеет следующие проблемы: спецификатор формата '% x' ожидает аргумент' unsigned int', а не 'unsigned long'. спецификатор '% p' (и' void * ') будет более уместным.Вы также не разыскиваете указатель правильно, вместо этого, чтобы значение 'value' содержало указатель на' p'. – Hasturkun

+0

@Hasturkun вы можете отредактировать мой ответ или дать свой собственный ответ, если сможете. –

5

Пожалуйста, не делайте этого. Пожалуйста, используйте IPC, то есть межпроцессное общение.

Если у вас есть два процесса на практически любой современной компьютерной системе, у них будут свои виртуальные адресные пространства. Указатель в одном процессе НЕ имеет смысла в каком-то другом процессе.

Я рекомендую вам изучить некоторые методы IPC, такие как разделяемая память или очередь сообщений, см. В разделе http://en.wikipedia.org/wiki/Inter-process_communication для некоторых ссылок. Существует множество доступных методов. Вы должны использовать это, чтобы перемещать двойное значение, а не указатель на него. Если обе программы нуждаются в параллельном доступе к этому двойнику, вам нужно подумать о том, как вы собираетесь его синхронизировать.

ПОЖАЛУЙСТА, пожалуйста, пожалуйста, не используйте файловую систему для IPC. Это действительно ужасная идея.

+0

Эй! После публикации этого вопроса я понял, что ограничение между процессами указателя. Большое спасибо за указание на это. Последнее сомнение заключалось в том, что использование malloc() также приведет к тому же? – user2438252

+0

Кроме того, можете ли вы направить меня на некоторые полезные руководства/примеры использования разделяемой памяти для взаимодействия между процессами? Спасибо. – user2438252

+0

Это выглядит нормально - http://www.cs.cf.ac.uk/Dave/C/node27.html. Я понятия не имею, что делают ваши соответствующие программы, и поэтому я не знаю, подходит ли вам общая память или нет. Я обычно использую больше схемы передачи сообщений для связи между процессами - в этом случае я бы использовал очередь сообщений или сокеты TCP/UDP - преимущество TCP/UDP заключается в том, что эти два процесса могут быть на физически отдельных машинах, но TCP и UDP имеют свои плюсы и минусы. (Многие проблемы в жизни - это проблемы компромиссов, часто нет правильных ответов!) –

0

Вы хотите, чтобы вы преобразовали строку с шестнадцатеричным значением в 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); 
Смежные вопросы