从指针复制地址

时间:2013-01-24 14:34:20

标签: c pointers

我有以下代码:

    /* Window size in bytes. */
static  uint32_t size = 0;
    /* Window address. */
static  uint32_t address = 0;
    /* Memory Base Address */   
static uint8_t *sharedMemory=NULL;

sharedMemory = memalign(size, size);

void rioShardMemoryWindowGet (uint8_t *baseAddr,uint32_t *memorySize,uint32_t *windowAddress  )
{
    *baseAddr=(int)sharedMemory;
    printf("sharedMemory: #%x",sharedMemory);
    *memorySize=size;
    *windowAddress=address;
}
rioShardMemoryWindowGet(&baseAddr0, &baseSize, &(Addrs.virtualBaseAddr));
printf("baseAddr0 : #%x",baseAddr0);

我不知道为什么baseAddr0在第二个printf中为0,而在第一个sharedMemory中为0x500000。

3 个答案:

答案 0 :(得分:1)

rioShardMemoryWindowGet如果您希望修改uint8_t **baseAddrPtr,则应接受baseAddr0。那么你将*baseAddr = sharedMemory没有演员。

答案 1 :(得分:1)

您必须将指针作为函数参数传递给指针。 只有这样,您才能将值存储在其中。在您的情况下,您尝试将sharedMemory的地址存储在baseAddr[0]位置。

/* Window size in bytes. */
static  uint32_t size = 0;
    /* Window address. */
static  uint32_t address = 0;
    /* Memory Base Address */   
static uint8_t *sharedMemory=NULL;

sharedMemory = memalign(size, size);

void rioShardMemoryWindowGet (uint8_t **baseAddr,uint32_t *memorySize,uint32_t *windowAddress  )
{
    *baseAddr=sharedMemory;
    printf("sharedMemory: #%x",sharedMemory);
    *memorySize=size;
    *windowAddress=address;
}
uint8_t *baseAddr0;
rioShardMemoryWindowGet(&baseAddr0, &baseSize, &(Addrs.virtualBaseAddr));
printf("baseAddr0 : #%x",baseAddr0);

答案 2 :(得分:1)

好的,我想我理解你的问题。

您正在尝试将地址编号存储在baseAddr0中,对不对? (不确定原因,但这是我想出的唯一的事情)。

0x500000显示为0的原因是因为uint8_t没有足够的位来表示地址,所以它“剔除”只有1个字节(因此显示为0)。

将baseAddr更改为uint32_t,瞧,一切正常。

无论如何,其他海报告诉你使用指针指针的原因是因为你看起来要做的事情很奇怪,除非你打算使用地址做一些特别的事情。如显示它或用作偏移量,也许?

p.s。:您还需要更改此行

*baseAddr=(uint32_t)sharedMemory;

编辑:您的代码应如下所示,以获得您想要的内容:

    /* Window size in bytes. */
static  uint32_t size = 0;
    /* Window address. */
static  uint32_t address = 0;
    /* Memory Base Address */   
static uint8_t *sharedMemory=NULL;

sharedMemory = memalign(size, size);

void rioShardMemoryWindowGet (uint32_t *baseAddr,uint32_t *memorySize,uint32_t     *windowAddress  )
{
    *baseAddr=(uint32_t)sharedMemory;
    printf("sharedMemory: #%x",sharedMemory);
    *memorySize=size;
    *windowAddress=address;
}
rioShardMemoryWindowGet(&baseAddr0, &baseSize, &(Addrs.virtualBaseAddr));
printf("baseAddr0 : #%x",baseAddr0);

你需要uint32存储数字地址的原因是因为地址是32位,这就是为什么你看到0使用8位值的原因,因为0x500000映射到0x00到一个字节