【问题标题】:Want to access struct pointer's data of type from struct's memory in C想要从 C 中结构体的内存中访问结构体指针的类型数据
【发布时间】:2014-01-19 20:43:22
【问题描述】:

我的程序动态分配结构指针类型的节点。我想通过它的内存地址访问结构指针的数据。我的问题的主要目的是测试带有拆分的 b-tree 插入。这是结构:

struct LeafNode
{
    int EmpID[M];
    int Location[M];
    int keys;
};
typedef struct LeafNode* LNodePtr;

这是我的测试代码:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int * a = (int *)malloc(sizeof(int));
    *a = 5; 
    printf("int a created at %p\n", (void *) &a);

    void * addr;

    printf("Give the memory address: ");
    scanf("%p", addr);
    void * addr2 = (void *)addr;
    printf("The value at memory is: %d\n",*(int*)addr2);

return 0;
}

结果如下:

int a 创建于 0xbff573b4
给出内存地址:0xbff583b4
分段错误

第二步是转换为 LNodePtr 而不是 int。我不知道我们是否可以使用双重投射,即

*(int *(LNodePtr))addr 

这样我就可以访问了

struct's EmpID[0]

int 成员通过内存。感谢您的帮助。

【问题讨论】:

  • 当我运行程序时,操作系统会改变进程的虚拟内存地址。谢谢。

标签: c pointers struct


【解决方案1】:
void * addr;

分配一个指针,但不初始化它。

scanf("%p", addr);

读取指向存储在addr 中保存的地址的变量的指针。你没有初始化 addr 所以这是未定义的行为。

也许你打算写:

scanf("%p", &addr);

但这很难说。尤其是因为您详细讨论了struct,然后代码中没有提及结构,而是使用void*


printf("int a created at %p\n", (void *) &a);

这将打印保存指针a 的变量的地址。如果要打印指针的值,请使用a 而不是&amp;a

【讨论】:

  • 我认为你的意思是初始化一个指针,但不分配它。
  • @Ethan 不,我的意思是我写的。那行代码分配了一个指针,但没有初始化它。分配一个指针,一个保存地址的变量,和分配一个地址可以分配给指针变量的内存块是有区别的。
  • 感谢您的回答。我看到了我的错误。
【解决方案2】:

你不应该在你的 printf 行中取消引用 a,a 本身已经是一个指针,*a 是 int!

printf("int a created at %p\n", (void *) a);

另外,您应该取消引用 scanf 中的 void*

scanf("%p", &addr);

作为一般提示,请尝试使用 C 标志 -Wall 进行编译,这样您就可以轻松发现这些错误。

要回答 cmets 中的问题,如果您的节点地址为 0x1234,您可以这样做:

MyNode *node = 0x1234;
node->int[0] = 5;

希望能回答问题

【讨论】:

  • 如果我使用 struct node{int id[5];}MyNode;如何从给定地址访问 id[0] 元素而不是 (int)addr2) 强制转换?谢谢...
  • 你可以像这样遍历数组: MyNode node;节点.id[0] = 5;节点.id[1] = 2; ...
  • 我知道这种访问方法。我们只知道节点地址,我们只想访问 struct 的 id 元素,例如 code *(int *(LNodePtr))addr
  • 我在回复中添加了一些文本,因为这些注释字段中没有代码支持
猜你喜欢
  • 1970-01-01
  • 2019-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-16
  • 2021-01-08
  • 1970-01-01
相关资源
最近更新 更多