想要从C中的struct的内存中访问struct指针的类型数据

时间:2014-01-19 20:43:23

标签: c pointers struct

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

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创建于0xbff573b4
给出内存地址:0xbff583b4
分段故障

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

*(int *(LNodePtr))addr 

以便我可以访问

struct's EmpID[0]

int成员通过记忆。谢谢你的帮助。

2 个答案:

答案 0 :(得分:0)

void * addr;

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

scanf("%p", addr);

读取存储在addr中保存的地址的变量的指针。您没有初始化addr,因此这是未定义的行为。

也许你打算写:

scanf("%p", &addr);

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


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

这将打印包含指针a的变量的地址。如果要打印指针的值,请使用a代替&a

答案 1 :(得分:0)

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

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

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

scanf("%p", &addr);

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

要回答评论中的问题,如果你有节点地址0x1234,你可以这样做:

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

希望回答问题