【问题标题】:Pointer to stored specific memory address指向存储的特定内存地址的指针
【发布时间】:2013-06-04 10:31:27
【问题描述】:

我在 txt 文件中有内存位置地址。我想从文件中读取地址并使用存储在该地址的值。这是我所做的:

char line[10];
FILE *f;
f=fopen("p:\\address.txt", "r");
fgets(line,10,f);

该文件包含地址 0x12ff30。我已将其存储在 char 数组行中。该地址包含一个双精度值(从 0x12ff30 开始的 8 个字节)。现在如何创建和使用指针来获取存储在该地址的值?

谢谢。

【问题讨论】:

  • 你确定这是你想做的吗?一般来说,您无法访问任意内存位置并获得有意义的行为。
  • @OliCharlesworth 嘿!实际上,我正在运行另一个将数据实时写入此内存位置的软件。所以我很确定我想访问这个位置并获得那个值:)
  • 你真的不想这样做。如果您的程序共享内存空间,那么有更好的方法来获取指针,比如全局变量?至少您需要查看 IPC en.wikipedia.org/wiki/Inter-process_communication,例如共享内存。请不要将文件系统用作进程间通信的方法!...
  • @user2438252:嗯。在大多数系统上,由于virtual memory,两个独立的程序将具有完全不同的地址空间。所以一个程序中的地址在另一个程序中没有意义。
  • @OliCharlesworth 完全正确。大约 3 周前,我记得有人想将指针重定向到 C++ 中的 iostream 和从 iostream 中取出。我们进行了同样的对话。指针一旦离开程序就毫无意义!

标签: c pointers memory-address


【解决方案1】:

请不要这样做。请使用IPC,即进程间通信。

如果您在几乎任何现代计算机系统上都有两个进程,它们将拥有自己的虚拟地址空间。一个进程中的指针在其他进程中没有意义。

我建议您需要考虑使用 IPC 的某些方法,例如共享内存或消息队列,请参阅http://en.wikipedia.org/wiki/Inter-process_communication 获取一些链接。有很多方法可用。您应该使用它来移动双精度值,而不是指向它的指针。如果两个程序都需要同时访问该双重,那么您需要考虑如何同步它。

请不要将文件系统用于 IPC。这真是一个糟糕的主意。

【讨论】:

  • 嘿!发布后,我意识到指针的进程间限制。非常感谢您指出这一点。最后一个疑问是使用 malloc() 是否也会导致同样的结果?
  • 另外,您能否指导我一些有用的教程/使用共享内存进行进程间通信的示例?谢谢。
  • 这看起来不错 - cs.cf.ac.uk/Dave/C/node27.html。我不知道你们各自的程序做了什么,所以我不知道共享内存是否适合你。我通常使用更多的消息传递方案在进程之间进行通信——在这种情况下,我会使用消息队列或 TCP/UDP 套接字——TCP/UDP 的优点是这两个进程可以在物理上独立的机器上,但是 TCP 和UDP 各有优缺点。 (生活中的很多问题都是取舍的问题,往往没有正确的答案!)
【解决方案2】:

让我们假设该地址中有int 值。另外让我们假设地址是可访问的[当您再次读取文件时,地址可能无效]并且它不会崩溃。
那么,

void *p;
sscanf(line, "%p", &p);   
double value = *(double *)p;

//use value for other operations.

【讨论】:

  • 您正在扫描到double?
  • 我不会立即给你-1,但你的答案有以下问题:%x 格式说明符需要unsigned int 参数,而不是unsigned long。 %p 说明符(和 void *)会更合适。您也没有正确取消引用指针,而是将 value 设置为包含指向 p 的指针。
  • @Hasturkun 您可以编辑我的答案或提供您自己的答案。
  • @Hasturkun 那么可以直接value = (int) *k na.
  • 完成。当帖子是新鲜的并且可以由其所有者改进时,或者当我认为应该澄清某些事情时,我倾向于发表评论而不是编辑。这也有助于我避免编辑大战:P
【解决方案3】:

您的意思是要将具有十六进制值的字符串转换为int? 我有这个例子

#include"stdio.h"
#include"stdlib.h"
int main()
{
    char buff[] = "0x12ff30";
    int num = strtol(buff,NULL,16);
    printf("%x\n", num);  // this is 12ff30

    return 0;

}

所以,你可以试试这个。

char line[10];
FILE *f;
f=fopen("p:\\address.txt", "r");
fgets(line,10,f);
int address = strtol(line,NULL,16);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-03
    • 2011-01-24
    • 2013-12-22
    • 2011-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多