Как написать адрес (указатель) в текстовом файле, который может быть прочитан и разыменован в C - PullRequest
3 голосов
/ 14 мая 2010

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

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

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

Ответы [ 5 ]

8 голосов
/ 14 мая 2010
fprintf(file, "%p", pointer);

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

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

[добавлено]

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

должен читать шестнадцатеричное кодированное целое число, адрес a.k.a.

6 голосов
/ 14 мая 2010

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

4 голосов
/ 14 мая 2010

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

#include <stdio.h>

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

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

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

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

3 голосов
/ 14 мая 2010

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

#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

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

1 голос
/ 14 мая 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...