如何在可以在C中读取和解除引用的文本文件中写入地址(指针)

时间:2010-05-14 08:30:22

标签: c file pointers

我想在一个文本文件中写一个地址,该文件可以由fscanf读取,并在读取指针后由C取消引用。如何在文件中写入地址?

修改 我不是故意粗鲁,但我知道这正是我所需要的,所以如果有人可以请你只是列出答案,而不是为什么我不应该这样做的道德原因,那就太棒了! / p>

进一步修改 啊,我不清楚自己想做什么。在emacs中,我想(用我的手指!!)写一个C程序可以使用fscanf读取的地址并用作指针。我如何(用我的手指!!)在emacs中写一个地址。例如,如果我希望C在0x11111111中读取,我正在尝试在emacs中编写0x11111111,但在我阅读它时它并没有成为C中的正确地址。

5 个答案:

答案 0 :(得分:8)

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

应该做的工作;但如果您阅读文件,那么地址是否有用是值得怀疑的......

对于某些硬件寄存器/ IO端口或共享内存,这可能很有趣,但在一般情况下:不要使用它。 Segfault,无意义数据或数据损坏将成为结果......

[加入]

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

应读取十六进制编码的整数,即.k.a。地址。

答案 1 :(得分:6)

你不能这样做。当再次读入指针时,无法保证指针有效 - 如果它被另一个进程读取,它几乎肯定不会。如果它是由同一个进程读取的,为什么首先将它写入文件?

答案 2 :(得分: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);
}

指针是相同的。

顺便说一句,如果你写“0x12345678”,格式字符串应该是"0x%p"来正确处理“0x”前缀。

答案 3 :(得分: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

修改为进一步修改:尝试使用"%x"读取十六进制数字。

答案 4 :(得分:1)

您可以为指针类型指定一个整数值,以便使用类型转换,例如

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

需要注意的是,结果是实现定义的(未定义,请注意),甚至可能无法使用。