解引用强制转换后的指针是否违反严格别名规则?附代码咨询
严格别名规则相关问题解答
问题1:解引用经过强制转换的指针是否违反严格别名规则?
不是所有强制转换后解引用的操作都违反严格别名规则。严格别名规则的核心限制是:不能用与对象实际类型不兼容的指针类型来访问该对象,但存在多个合法例外:
void*可以安全转换为任意对象指针类型,再解引用访问原对象完全合法- 字符类型(
char/unsigned char/signed char)的指针可以访问任何类型的对象 - 联合的不同成员指针之间可以互相访问(对应你提到的实际代码场景)
只要强制转换后的指针类型与原对象的实际类型匹配,或者属于上述例外情况,就不会违反严格别名规则。
问题2:以下代码是否违反严格别名规则(或其他规范规则)?
先看给出的代码:
void *get_int_ptr(void) { static int ival = 0; return (void*)&ival; } #define GET_INT() *((int*)get_int_ptr()) void main() { GET_INT() = 123; printf("%i", GET_INT()); }
严格别名规则判断:
这段代码不违反严格别名规则。原因是:get_int_ptr返回的void*指向的是实际类型为int的对象ival,宏里将void*强制转换为int*后解引用,此时指针类型与原对象的实际类型完全一致,符合规则要求。
其他规范问题:
代码中的void main()不符合C标准规范,C标准规定main函数的返回类型必须是int,正确写法应为:
int main() { GET_INT() = 123; printf("%i", GET_INT()); return 0; }
内容的提问来源于stack exchange,提问作者Edwin Skeevers
相关产品推荐
相关产品推荐

