short var = *((unsigned short*)&"BM");
"BM"
必须位于只读存储区的某处,那为什么我不能获得指向它的指针呢? (它编译但是它表示无效的内存区域(clang编译器))
答案 0 :(得分:5)
C不允许获取文字的地址:
一元
&
运算符的操作数应该是函数指示符,[]
或一元*
运算符的结果,或者是指定不是对象的对象的左值位字段,不使用register
存储类说明符声明。
- C99 6.5.3.2/1
文字不属于任何允许的操作数类别。这是语言的形式约束 - 不需要符合要求的实现来接受违反它的代码,并且 需要生成描述违规的诊断。 C没有定义违反约束的代码行为。
你可以实现类似于你想要的东西:
union short_str {
char str[3];
int16_t sh;
} u = { "BM" };
short var = u.sh;
除此之外,这还避免了取消引用指向未对齐存储的指针的风险。 C将对齐变量u
的存储空间,以便所有成员在适当的边界上对齐。这避免了您最初尝试过的任何方法可能存在的陷阱。
答案 1 :(得分:0)
最简单的解决方案当然是:
short var= 0x424D; // memory reads 4D, 42 = 'M', 'B'
或
short var= 0x4D42; // memory reads 42, 4D = 'B', 'M'