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

Imo*_*lis 8 c string pointers memory-management c89

short var = *((unsigned short*)&"BM");
Run Code Online (Sandbox Code Playgroud)

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

Joh*_*ger 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;
Run Code Online (Sandbox Code Playgroud)

除此之外,这还避免了取消引用指向未对齐存储的指针的风险.C将使变量的存储对齐,u以便所有成员在适当的边界上对齐.这避免了您最初尝试的任何方法可能存在的陷阱.