指向struct的指针。成员读取值的分段错误

时间:2014-10-20 07:04:23

标签: c linux pointers memory struct

我试图映射物理内存的某个区域,然后将其放入struct中。映射正常,分配正常。 (我想是的,因为没有分段错误。)问题是当我尝试从结构中读取一些值时。

我的结构是这样的:

struct some_struct {
    unsigned long a;
    unsigned long b;
    unsigned long c;
    unsigned long d;
    unsigned long e;
    unsigned long f;
};

然后我映射了内存:

void *pc = (void *) mmap(0, PageSize * 2, PROT_READ | PROT_WRITE, MAP_SHARED, fd, addr_start);

不要过分关注参数。我100%肯定这很好用。之后我这样做:

struct some_struct *ptr = ((struct some_struct *)(pc + some_offset));  

然后我尝试:

printf("DDR[%p] -> 0x%x\n", &(ptr->a));

我得到了会员的地址。它指向内存中的物理地址。但以下让我分割错误:

printf("DDR[%p] -> 0x%x\n", &(ptr->a), ptr->a);

我不确定在分配结构时是否必须使用物理虚拟地址。或者我错过了一些非常明显的东西。

1 个答案:

答案 0 :(得分:1)

您的代码不足以提供全面的帮助。

我只能提供您的代码中可能存在的问题:

来自man mmap

1)如果您想要读写,您的代码中应该有open("./file.txt", O_RDWR);

The prot argument describes the desired memory protection of the mapping 
(and must not conflict with the open mode of the file).

2)您将must偏移为k*sysconf(_SC_PAGE_SIZE) 例如,在我的系统上,页面大小为4096。因此,addr_start必须与4*4096类似,但不能与12或任意数字相同。

offset must be a multiple of the page size as returned by sysconf(_SC_PAGE_SIZE)

3)在启用所有警告的情况下编译代码,并查看编译器将写入的内容。如果您使用gcc,请添加-Wall标记。您已经在printf语句中有一个未定义的行为(这已在评论中提到过),并且-Wall编译器会告诉您它。

4)如果您仍然希望编译时没有-Wall标志,那么请确保您的程序中包含所有必需的标头。我已经包括:

//mmap
#include <sys/mman.h>
//printf
#include <stdio.h>
//open
#include <stdlib.h>
#include <sys/types.h>
#include <fcntl.h>
//sysconf
#include <unistd.h>

希望这会有所帮助。

P.S。在我写完这篇文章之后,我已经看到你已经解决了你的问题(但我仍然不明白你的问题)。所以我只是留下这个以防任何其他填充有类似的行为,但不同的问题。