获取指向字符串常量的指针
Obtaining pointer to a string constant
short var = *((unsigned short*)&"BM");
"BM"
必须位于只读内存区域的某处,那么为什么我不能获得指向它的指针? (它编译但它说无效的内存区域(clang 编译器))
C 不允许获取文字地址:
The operand of the unary &
operator shall be either a function designator, the result of a []
or unary *
operator, or an lvalue that designates an object that is not a bit-field and is not declared with the register
storage-class specifier.
-- C99 6.5.3.2/1
文字不属于任何允许的操作数类别。这是语言的正式约束——符合规范的实现不需要接受违反它的代码,并且 需要产生描述违规的诊断。 C 没有定义违反约束的代码行为。
您可以像这样实现类似于您想要的东西:
union short_str {
char str[3];
int16_t sh;
} u = { "BM" };
short var = u.sh;
除其他外,这避免了取消引用指向未对齐存储的指针的风险。 C 将对齐变量 u
的存储,以便所有成员都在适当的边界上对齐。这避免了按照您最初尝试的路线使用任何方法时可能出现的陷阱。
最简单的解决方案当然是:
short var= 0x424D; // memory reads 4D, 42 = 'M', 'B'
或
short var= 0x4D42; // memory reads 42, 4D = 'B', 'M'
short var = *((unsigned short*)&"BM");
"BM"
必须位于只读内存区域的某处,那么为什么我不能获得指向它的指针? (它编译但它说无效的内存区域(clang 编译器))
C 不允许获取文字地址:
The operand of the unary
&
operator shall be either a function designator, the result of a[]
or unary*
operator, or an lvalue that designates an object that is not a bit-field and is not declared with theregister
storage-class specifier.
-- C99 6.5.3.2/1
文字不属于任何允许的操作数类别。这是语言的正式约束——符合规范的实现不需要接受违反它的代码,并且 需要产生描述违规的诊断。 C 没有定义违反约束的代码行为。
您可以像这样实现类似于您想要的东西:
union short_str {
char str[3];
int16_t sh;
} u = { "BM" };
short var = u.sh;
除其他外,这避免了取消引用指向未对齐存储的指针的风险。 C 将对齐变量 u
的存储,以便所有成员都在适当的边界上对齐。这避免了按照您最初尝试的路线使用任何方法时可能出现的陷阱。
最简单的解决方案当然是:
short var= 0x424D; // memory reads 4D, 42 = 'M', 'B'
或
short var= 0x4D42; // memory reads 42, 4D = 'B', 'M'