C 从指针复制地址

C 从指针复制地址,c,pointers,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 rioShardMemoryW

我有以下代码:

    /* 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。

rioShardMemoryWindowGet
应该接受
uint8\t**baseAddrPtr
,如果您想修改
baseAddr0
。然后您将拥有
*baseAddr=sharedMemory
,而无需强制转换。

您必须将指针作为函数参数传递给指针。 只有这样,您才能在其中存储值。在本例中,您尝试将
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);

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

你想把地址号码存储在baseAddr0中,对吗?(不确定原因,但这是我唯一想到的)

0x500000显示为0的原因是uint8\u 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到字节

,但我只想,baseAddr0的地址sharedMemory指向我建议的地址,这相当于分配
baseAddr0=sharedMemory在函数外部。我相信这是您想要的,不是吗?我如何将sharedMemory指向的地址存储在baseAddr中?如果您阅读代码,您将在函数
rioShardMemoryWindowGet
中执行此操作。将指针baseAddr0的地址传递给函数调用中的函数。第一个语句完成了您要求的任务。我建议您进行一步一步的调试,检查内存位置和变量以理解这个概念;必要吗?它们不是都是uint8吗?另外,你能展示一下baseAddr0的定义吗?是的,你的权利。这就是我想要的。但是sharedMemory也很有用,所以它应该可以工作。但我还是尝试了你的线索-->没有成功没有,没有,一个地址需要32位,它无法与你使用uint8\u t一起工作,因为你正在丢失信息。。。我将更新上面的代码,向您展示如何操作。也许您可以使用
sizeof
运算符检查指针的大小。这也是一个选项,只是不要使用int8,这样会丢失信息实际上,此代码会在不同的体系结构上给出不同的结果。如果你想构建一个可移植的代码,这可能不是一个正确的方法!例如32位和64位体系结构?因为我认为使用
uint32\u t*
32位变量是很常见的,但在64位体系结构上,它可以是64位的!或者8位体系结构,它可以是8位的。