我需要找到最符合标准的方式来获取指针的地址并分别存储其字节(例如,串行传输)。指针地址符合标准的转换
我有两个版本,第一个包含,我相信,未定义的行为,第二个,它应该只包含根据C99定义的行为。但是我的工具告诉我,我还有第二个未定义的行为。是否有人可以确认它,并且指出一个解决方案,如果可能,既没有未定义的行为,也没有实现定义的行为?
编辑:我改变了类型从int
到unsigned long
找到一个非实现相关的解决方案,以帮助。我也删除了“16位宽指针”。
unsigned long a[2];
unsigned char b0, b1, b2, b3;
int main1() {
unsigned long l = (unsigned long) &(a[0]);
b0 = (l >> 24) & 0xFF;
b1 = (l >> 16) & 0xFF;
b2 = (l >> 8) & 0xFF;
b3 = l & 0xFF;
return 0;
}
typedef union { unsigned long* p; char c[sizeof(unsigned long *)]; } u;
int main2() {
u x;
x.p = a;
b0 = x.c[3];
b1 = x.c[2];
b2 = x.c[1];
b3 = x.c[0];
return 0;
}
编辑2:加入参考关于这些程序C99标准的一部分:
任何指针类型可以被转换为整数类型。除了以前指定的以外, 结果是实现定义的。如果结果不能用整数类型表示,则 的行为未定义。结果不需要在任何整数 类型的值的范围内。
这是否意味着不可能在不依赖某些实现定义的行为的情况下读取数组a
的地址?还是有办法规避它?
您确定要发送的地址?无论如何,它们在其他主机或另一个地址空间上都不会有效。 –
我不知道任何具有16位指针的C的实现,但假设你是正确的(一些小的嵌入式系统或其他东西?)main1()没有错。你显然使用联合或main2()的东西,但是你没有向我们展示那些代码,所以我们不能帮你。 –
'int i =(int)&(a [0]);'因为'sizeof(int)!= sizeof(void *)'在某些系统上con有问题 –