2010-05-14 1 views
3

Я хотел бы написать адрес в текстовом файле, который может быть прочитан fscanf и разыменован C после прочтения указателя. Как написать адрес в файле?Как написать адрес (указатель) в текстовом файле, который можно прочитать и разыменовать в C

редактировать: я не хочу быть грубым, но я знаю, что это именно то, что мне нужно, так что если кто-нибудь может понравиться просто перечислить ответ, а не этические причины, почему я не должен быть делая это, это было бы здорово!

дальнейшая редакция: ах, я был неясным о том, что я хочу делать. В emacs я хочу (с моими пальцами !!) писать в адресе, который программа C может читать с помощью fscanf и использовать в качестве указателя. Как я физически (с моими пальцами !!) пишу адрес в emacs. Например, если я хотел, чтобы C читал в 0x11111111, я пытаюсь написать 0x11111111 в emacs, но он не становится правильным адресом в C, когда я его читаю.

+3

Какую проблему вы пытаетесь решить с помощью этого трюка? –

+2

Ну, ваше дальнейшее редактирование меня только сбивает с толку. Вы пишете '0x ...' или '...' в emacs? Какой адрес он становится, когда вы читаете его в C? Как вы его читаете? Отправьте самую маленькую программу, которая показывает проблему. – IVlad

ответ

4

Я не вижу проблемы, вот фрагмент кода, используя строку вместо файла:

#include <stdio.h> 

int main() { 
    void *p1,*p2; 
    p1 = (void*)0x12FE0FE0A; 
    char str[] = "12FE0FE0A"; 

    sscanf(str, "%p", &p2); 
    printf("%p %p\n",p1,p2); 
} 

указатели идентичны.

BTW, если вы пишете «0x12345678», строка формата должна быть "0x%p" для правильной обработки префикса «0x».

6

Вы не можете этого сделать. Нет гарантии, что указатель будет действителен, когда он будет снова прочитан - если он будет прочитан другим процессом, его почти наверняка не будет. И если он читается одним и тем же процессом, зачем писать его в файл в первую очередь?

+1

Насколько это верно, я физически НЕ МОГУ это сделать, или просто, что он, вероятно, не сработает? если это последнее, мне нужно знать, как это сделать. – sepiroth

+1

@hatorade Почему, по-вашему, вам нужно это делать? Должен быть лучший способ решить вашу проблему, но вы не сказали, что такое настоящая проблема! – 2010-05-14 08:37:36

+2

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

8
fprintf(file, "%p", pointer); 

должен выполнить эту работу; но сомнительно, если адрес используется, если вы читаете файл ...

Возможно, для некоторых аппаратных регистров/IO-портов или разделяемой памяти это может быть интересно, но в общем случае: не использовать Это. Segfault, чувственное меньше данных или данных, повреждение будет результат ...

[добавлено]

fscanf(... "%x" ...) 

следует читать шестнадцатеричное целое число закодировано, А.К.А. адрес.

+0

Мне нужно это наоборот; начиная с emacs, я хочу написать адрес вручную – sepiroth

+0

взгляните на формат, но он должен быть просто шестнадцатеричным номером – fortran

3

Что-то вроде этого, может быть?

#include<stdio.h> 

int main() 
{ 
    FILE *out = fopen("test.out","w"); 
    int i = 6; 
    int *pi = &i; 

    fprintf(out, "%d", pi); 
    fclose(out); 

    printf("pi points to an int that has the value of %d\n", *pi); 

    FILE *in = fopen("test.out","r"); 
    fscanf(in, "%d", &pi); 
    fclose(in); 

    printf("After reading the value of pi from the file, it points to an int that has the value of %d\n", *pi); 
} 

Если вы хотите, чтобы прочитать значение, то это все, что вы должны заботиться о:

int *pi; 
fscanf(in, "%d", &pi); 
// use *pi to dereference normally 

Edit для вашего дальнейшего редактирования: попробуйте использовать "%x" читать в шестнадцатеричное число.

1

Вы можете назначить целочисленное значение типу указателя, чтобы вы использовали листинг типа, например.

unsigned char *vram = (unsigned char *)0xA0000000; 

Протест в том, что результат от реализации (не определено, ум вам), и не может быть даже полезной.

Смежные вопросы