我正在考虑用memset将结构初始化为所有-1s(因为它使用了 没有带符号的数字,零是有效值)。
-1是一个有效的指针地址吗?我的想法还有其他问题吗? 注意:平台是linux / gcc / x86
P.S。我正在尝试初始化一个不是所有指针的结构,并且零对所有无效的类似值都有效,所以我可以选择在一个函数中进行部分初始化,然后将非初始化字段初始化为默认值。如果有一种模式/策略可以在c?
中执行此操作答案 0 :(得分:3)
-1
作为指针的解释依赖于架构,因此不可靠。
通常,memset
旨在设置字节,而不是指针。 C不保证各个字节如何组合来制作指针。即使您的解决方案有效,您也必须记录它的工作原理和原因。
当NULL
是有效值时,更好的想法是将所有指针设置为适当类型的标记。因此,如果您的结构包含字段int *ip
:
static const int sentineli;
// in the initialization:
foo->ip = (int *)&sentineli;
然后与该值进行比较。这是自我记录的。
答案 1 :(得分:3)
通常,唯一有效的指针值是NULL,指向现有对象的开头,内部和右边的指针。另请注意,NULL不一定必须表示为具有零的位模式:s。
在某些体系结构上,-1是合法的指针值。一些微控制器在内存的低部分具有RAM,在上部具有只读存储器(如闪存)。
答案 2 :(得分:1)
负数通常以实现定义的方式存储。一些实现使用1的补码来存储负数,其他实现使用2的补码。
我的想法还有其他问题吗?
代码可能无法跨实现移植。
答案 3 :(得分:0)
在任何现实世界的桌面或服务器系统上,-1转换为指针等同于all-bits-one指针表示,并且它不是有效指针。假设指针添加发生在整数加法中,如果指针p
具有全比特一表示,p+1
将成为全比特零指针,在现实世界中它是空指针。
尽管如此,标准并未保证这一点。