我的目的是将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 :(得分:1)
你正在做的事情相当脆弱,而且定义不明确:
%p
说明符产生了什么(你似乎期望一个十六进制数,但标准并不能保证)%x
是否与您机器上指针的大小相匹配(%x
想要一个unsigned int
,这对于许多实现的指针来说是不够的。 那就是说,我相信你的直接问题更简单:你需要回放文件(使用rewind
或fseek
),然后才能阅读你写的内容。
答案 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);