我已经适度地陷入困境,谷歌搜索正确的单词无法让我找到正确的答案。更糟糕的是,我已经做到了,但我自己的代码示例在源代码中遗失了。
#include <stdio.h>
int main()
{
short x = 0xABCD;
char y[2] = { 0xAB, 0xCD };
printf("%x %x\n", y[0], y[1]);
printf("%x %x\n", (char *)&x[0], (char *)&x[1]);
}
基本上我需要通过指针算法通过数组访问单个变量字节,无需任何计算,只需通过类型转换。
答案 0 :(得分:3)
在演员周围加上括号:
printf("%x %x\n", ((char *)&x)[0], ((char *)&x)[1]);
请注意,endian-ness可能会改变您的预期结果。
将来,使用-Wall
进行编译,以查看警告或错误是什么。
答案 1 :(得分:1)
在C99中有所支持。通过一个称为通过联合的类型惩罚的过程。
union {
short s;
char c[2];
} pun;
pun.s = 0xABCD;
pun.c[0] // reinterprets the representation of pun.s as char[2].
// And accesses the first byte.
指针转换(只要它是char*
,以避免严格的别名违规)也没问题。
short x = 0xABCD;
char *c = (char*)&x;
答案 2 :(得分:1)
如果您只是为了获取值而烦恼,可以将源变量的地址存储在char *
中并递增和取消引用char
指针以进行打印每个字节的值。
引用C11
,章节§6.3.2.3
[....]当指向对象的指针转换为指向字符类型的指针时, 结果指向对象的最低寻址字节。连续增量 结果,直到对象的大小,产生指向对象剩余字节的指针。
类似的东西(考虑伪代码,未经过测试)
#include <stdio.h>
int main(void)
{
int src = 0x12345678;
char * t = &src;
for (int i = 0; i < sizeof(src); i++)
printf("%x\t", t[i]);
return 0;
}
应该这样做。
那说,要详细说明接受的答案, 为什么 部分:
根据operator precedence table,数组索引运算符的优先级高于类型转换,因此除非明确强制,否则在表达式中
(char *)&x[0]
x
的类型未按预期更改。因此,为了强制使用类型转换,我们需要将它括在额外的括号中。