从文件中获取指针地址

时间:2016-02-13 15:00:40

标签: c

我的目的是将malloced区域的起始地址写入文件,然后分配一个新指针从文件中读取该地址,以便该指针可以指向同一个地址。不幸的是,我没有得到正确的结果。

#include <stdio.h>

struct log_t{
  char data[0];
};

int main(void)
{
  FILE *fp;

  fp = fopen("example.cfg", "w");

  if (fp == NULL) {
    fprintf(stderr, "Can't open file\n");
    exit(1);
  }

  struct log_t* log = malloc(sizeof(struct log_t));
  int node_id = 0;

  fprintf(fp, "Node%d's malloc address is %p\n", node_id, log);

  int i = 0;
  struct log_t* read_log;
  while(fscanf(fp, "Node%d's malloc address is %x", &i, &read_log) == 2){
  }
  printf("read_log points to %p\n", read_log);

  free(log);
  fclose(fp);

  return 0;
}

3 个答案:

答案 0 :(得分:1)

你正在做的事情相当脆弱,而且定义不明确:

  • 不清楚%p说明符产生了什么(你似乎期望一个十六进制数,但标准并不能保证)
  • 不清楚%x是否与您机器上指针的大小相匹配(%x想要一个unsigned int,这对于许多实现的指针来说是不够的。

那就是说,我相信你的直接问题更简单:你需要回放文件(使用rewindfseek),然后才能阅读你写的内容。

答案 1 :(得分:1)

它不会很好用,或者说它只会在当前进程中实际分配内存并将指针写入文件

如果您创建另一个读取和解析地址的程序,它将不会指向任何已分配的内存,如果您尝试取消引用指针(即实际使用该结构),则会导致未定义的行为

内存和分配对于每个进程都是唯一的,两个不同的进程(甚至是从同一程序创建的进程)不能保证它们具有相同的内存映射,甚至不能加载到同一个地址(由于{{3 }})。

答案 2 :(得分:0)

*scanf()没有标准等效*printf("%p", ...)。代码无法读取指针是一种标准方式。

struct log_t* read_log;
//                                  problem --v
while(fscanf(fp, "Node%d's malloc address is %x", &i, &read_log) == 2){

或者代码可以将指针转换为整数,然后转换为字符串,然后转换为整数并返回指针。

  

(C11)7.20.1.4能够保存对象指针的整数类型

... intptr_t

以下类型指定一个无符号整数类型,其属性是指向void的任何有效指针都可以转换为此类型,然后转换回指向void的指针,结果将等于原始指针:uintptr_t

这些类型是可选的。

struct log_t* log = ...

// convert to uintptr_t
uintptr_t uiptr = (uintptr_t) ((void *) log);

// convert to string
char buf[100];
sprintf(buf, "%jx", (intmax_t) uiptr);

// string to iptr
uintmax_t imax;
sscanf(buf, "%jx", &imax);
uiptr = imax;

// iptr to  struct log_t*
struct log_t* log2 = ((void *) uiptr); 

assert(log == log2);