获取指向字符串常量的指针

时间:2015-04-16 11:26:32

标签: c string pointers memory-management c89

short var = *((unsigned short*)&"BM");

"BM"必须位于只读存储区的某处,那为什么我不能获得指向它的指针呢? (它编译但是它表示无效的内存区域(clang编译器))

2 个答案:

答案 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'