C指针问题

Tim*_*Tim 3 c embedded pointers

在我的嵌入式c程序中,我有一个结构:

struct var{
    unsigned long value;
    unsigned long length;

    + More
}
Run Code Online (Sandbox Code Playgroud)

这些结构的数组用于保存变量.存储的大多数变量只是存储在'value'中,因此长度设置为1.
但是,这些变量中的一些是数组,我试图将起始地址存储在'value'中.

unsigned long lookup[10];
variables[x].length = 10;
Run Code Online (Sandbox Code Playgroud)

然后我不太确定如何存储地址......

variables[x].value = lookup;
// lookup is a pointer so I cant put it into value
Run Code Online (Sandbox Code Playgroud)

要么

variables[x].value = (unsigned long)lookup;
// value reads back through sprintf+uart as '536874692'
// which couldnt be a valid memory address!
Run Code Online (Sandbox Code Playgroud)

我可能只是放弃并在结构中添加一个指针变量

编辑:
我想避免添加指向结构的指针因为我必须返回并重写闪存读/写函数以保存指针.这些非常复杂,目前正在工作,所以我宁愿不碰它们!

EFr*_*aim 6

更清洁的选择是使用工会.

 struct var{
     union {
        unsigned long numeric;
        void *ptr;  
     } value;
     unsigned long length;

     + More
 }
Run Code Online (Sandbox Code Playgroud)

您也可以选择包含类型枚举,通常使用联合使用的部分.


Mar*_*n B 5

可以在存储地址value由它转换成一unsigned long,为你展现.(我认为你得到的值一个有效的地址...十六进制,它出现为0x20000EC4 ......看起来你的嵌入式系统的数据段从0x20000000开始,是吗?)

但是,指向int(或long)的指针永远不会"干净".为什么不添加一个

unsigned long *starting_address;
Run Code Online (Sandbox Code Playgroud)

你的结构?然后你可以避免类型转换.如果你担心这会需要更多的内存,你可以使用一个存储或者unsigned long *starting_address'unsigned long value`的联合,它仍然比铸造更清晰.