Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从文件中获取指针地址_C - Fatal编程技术网

C 从文件中获取指针地址

C 从文件中获取指针地址,c,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 op

我的目的是将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;
}
#包括
结构日志{
字符数据[0];
};
内部主(空)
{
文件*fp;
fp=fopen(“example.cfg”,“w”);
如果(fp==NULL){
fprintf(stderr,“无法打开文件”\n);
出口(1);
}
结构日志*log=malloc(sizeof(结构日志));
int node_id=0;
fprintf(fp,“节点%d的malloc地址是%p\n”,节点id,日志);
int i=0;
结构日志*读取日志;
而(fscanf(fp,“节点%d的malloc地址为%x”,&i,&read_log)==2){
}
printf(“读取日志指向%p\n”,读取日志);
免费(原木);
fclose(fp);
返回0;
}

您所做的事情相当脆弱,而且定义不太明确:

  • 尚不清楚
    %p
    说明符产生了什么(您似乎期望十六进制数,但标准并不保证)
  • 不清楚
    %x
    是否与计算机上指针的大小匹配(
    %x
    需要
    无符号int
    ,这对于许多实现中的指针来说是不够的)

这就是说,我认为您眼前的问题更简单:您需要先倒带文件(使用
倒带
fseek
),然后才能阅读您编写的内容

您所做的工作相当脆弱,而且定义不明确:

  • 尚不清楚
    %p
    说明符产生了什么(您似乎期望十六进制数,但标准并不保证)
  • 不清楚
    %x
    是否与计算机上指针的大小匹配(
    %x
    需要
    无符号int
    ,这对于许多实现中的指针来说是不够的)

这就是说,我认为您眼前的问题更简单:您需要先倒带文件(使用
倒带
fseek
),然后才能阅读您编写的内容

这不会很好地工作,或者更确切地说,它只会在实际分配内存并将指针写入文件的当前进程中工作

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


内存和分配对于每个进程都是唯一的,两个不同的进程(即使是从同一个程序创建的进程)不能保证它们具有相同的内存映射,甚至不能保证加载到相同的地址(由于),或者,它只在实际分配内存并将指针写入文件的当前进程中工作

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

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

*scanf()
没有标准等效的ot
*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能够容纳对象指针的整数类型

<代码>输入

以下类型指定了一个无符号整数类型,其属性是指向
void
的任何有效指针都可以转换为该类型,然后再转换回指向
void
的指针,结果将与原始指针相同:
uintpttr\u 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);
*scanf()
没有标准的等效ot
*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能够容纳对象指针的整数类型

<代码>输入

以下类型指定了一个无符号整数类型,其属性是指向
void
的任何有效指针都可以转换为该类型,然后再转换回指向
void
的指针,结果将与原始指针相同:
uintpttr\u 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);

这是同样的过程。OP所做的是脆弱和毫无意义的,但它应该是有效的。@Joachim Pileborg谢谢你的建议。如果这是在同一个过程中,如何通过读取文件来获得正确的结果?非常感谢。@HuangJie我不是在推荐或纵容你做的事情,但无论如何,为了帮助你,可以简单地说,
fscanf
格式是错误的。如果您在64位平台上,指针通常为64位,但
int
(或
%x
的预期,在
中无符号)通常仍为32位。这是相同的过程。OP所做的是脆弱和毫无意义的,但它应该是有效的。@Joachim Pileborg谢谢你的建议。如果这是在同一个过程中,如何通过读取文件来获得正确的结果?非常感谢。@HuangJie我不是在推荐或纵容你做的事情,但无论如何,为了帮助你,可以简单地说,
fscanf
格式是错误的。如果您在64位平台上,指针通常为64位,但
int
(或
“%x”
的预期在
中无符号)通常仍为32位。预期结果是什么?预期结果是什么?