C指针问题
在我的嵌入式c程序中,我有一个结构:C指针问题,c,pointers,embedded,C,Pointers,Embedded,在我的嵌入式c程序中,我有一个结构: struct var{ unsigned long value; unsigned long length; + More } 这些结构的数组用于保存变量。存储的大多数变量仅存储在“value”中,因此长度设置为1。 然而,其中一些变量是数组,我试图将起始地址存储在“value”中 unsigned long lookup[10]; variables[x].length = 10; 那么我不太确定如何存储地址 variable
struct var{
unsigned long value;
unsigned long length;
+ More
}
这些结构的数组用于保存变量。存储的大多数变量仅存储在“value”中,因此长度设置为1。然而,其中一些变量是数组,我试图将起始地址存储在“value”中
unsigned long lookup[10];
variables[x].length = 10;
那么我不太确定如何存储地址
variables[x].value = lookup;
// lookup is a pointer so I cant put it into value
或
我可能会放弃,在结构中添加一个指针变量
编辑:我希望避免将指针添加到结构,因为我必须返回并重写flash读/写函数来保存指针。这些都是相当复杂的,目前的工作,所以我宁愿不碰他们 如您所示,您可以将地址强制转换为
无符号long
,将其存储在值中。(我认为您得到的值是一个有效地址…十六进制,结果是0x20000EC4…看起来您的嵌入式系统的数据段从0x20000000开始,是吗?)
但是,将指针强制转换为int(或long)永远不会“干净”。为什么不加一个呢
unsigned long *starting_address;
到你的结构?这样你就可以避免打字了。如果您担心这将需要更多内存,可以使用一个联合来存储无符号长*起始地址或“无符号长值”,这仍然比强制转换更干净。我不认为在结构中放置指针有什么坏处。是否希望内存处于连续块中?你可以这么做
struct var
{
unsigned long *value;
unsigned long length;
unsigned long othervalue1;
unsigned long othervalue2;
};
但不要忘记使用malloc分别为值分配内存。或者如果它是一个固定数量的空间,你想使用
unsigned long value[50];
如果使用sprintf+uart查找,会发生什么。这给了你什么价值
除非涉及铸造或标志扩展,实际数据是相同的。sprintf只是对它有不同的解释
只使用指针的解决方案很好。如果您真的想使用int,那么应该使用intptr\t,它保证足够大,可以容纳指针。更干净的选择是使用union
struct var{
union {
unsigned long numeric;
void *ptr;
} value;
unsigned long length;
+ More
}
您还可以选择包括一个类型枚举,这与使用片段的并集通常是一样的。假设系统指针大小与无符号长字符串的大小相同(无gaurantee,请使用sizeof
检查),您将使用强制转换。但这是混乱和容易出错的。请考虑使用一个联合。< /P>
struct var{
unsigned short type;
union {
unsigned long i;
void *p;
} value;
unsigned long length;
+ More
}
当长度为1时,为什么不将该值设置为一个长度数组?无论如何,您将不会使用更多的空间。我不确定您为什么不将值定义为无符号长*
相反,请执行以下操作:
struct var{
union{
unsigned long solo_value;
unsigned long* multi_values;
}
unsigned long length;
+ More
};
此外,对齐规则在堆栈上的强制作用不如在堆中的强*。不过,如果您使用的是任何最新的编译器,它们无论如何都应该是。。。你可能在用sprintf砸东西。使用调试器或更可靠的工具提取值
*从技术上讲,malloc()等人强制执行8字节对齐规则,而不是语言。您的最佳选择是使用枚举,如前所述:
typedef struct var{
union {
unsigned long numeric;
void *ptr;
} value;
unsigned long length;
// + More
} composition_t;
然后使用lenght成员来区分数据类型:
composition_t array[2];
unsigned long lookup[10];
// Just a plain unsigned long value
array[0].value.numeric = 100;
array[0].length= 1;
// An array of 10 long values
array[0].value.ptr= lookup;
array[x].length = 10;
请记住,无符号long不能保证包含指针,尽管它在嵌入式系统中很可能包含指针。像其他答案所建议的那样,做标准的事情并使用工会。在任何符合标准的实现中,工会都会做正确的事情,而不仅仅是你现在正在使用的。此外,它还具有说出您的意思的优势,当没有立即摸索代码的人(可能是您,一年后)不得不处理代码时,这一点总是很有价值的。您知道偏移吗?
我不确定您真正想做什么,但在同一个结构中存储一个结构成员的地址似乎是不必要的
还有一个宏容器(google it),它是使用offsetof构建的,这可能也很有用。为什么536874692不能是一个有效地址?刚刚意识到这一点。536874692是20000EC4,这可能是有效的…请注意,如果您的“闪存读/写函数”不知道查找是指针,它们将不知道保存它指向的数据。我希望避免将指针添加到结构,因为我必须返回并重写闪存读/写函数以同时保存指针。闪存中只存储值,手动填充所有其他结构成员(未显示)。看来0x20000EC4有效,谢谢。
composition_t array[2];
unsigned long lookup[10];
// Just a plain unsigned long value
array[0].value.numeric = 100;
array[0].length= 1;
// An array of 10 long values
array[0].value.ptr= lookup;
array[x].length = 10;