使用额外引用和取消引用进行转换时的行为

时间:2016-10-11 23:04:30

标签: c casting

Recently I asked this question关于我正在使用的图书馆。我最初询问了一个特定示例的问题,为什么有unsigned char *str2 = *(unsigned char **) &str;之类的代码而不只是unsigned char *str2 = (unsigned char*) str;,答案在char到{{的上下文中解释了它的详细信息1}}。

但是,在下面这个问题的评论中,我被要求提供更多示例,所以我能够使用其他类型从源代码中提供一些:

unsigned char

void *q = *(void **)(&p[i]);

(还有其他人我现在很难找到,我的正则表达式搜索技能很弱。我记得基本表格但找不到行号,但如果有人可以提供想要它。)

我的问题下方的评论告诉我,这些类型的行为与fz_colorspace **out_colorspace = (fz_colorspace **)(void *)(&node_ptr[colorspace_off]); - > char*的行为不同,但是当我尝试跟进聊天以澄清原因时那将是,我从未收到回复。

以这种方式投射(unsigned char*)与一般情况下更简单的方法(type2 *b = *(type2**) &a)有什么不同?或者,这只会影响到按类型分类?

1 个答案:

答案 0 :(得分:1)

(type2*) a以任何类型评估a,然后将结果转换为type2*

*(type2**)&a获取a的地址,并将该地址重新解释为type2**类型之一,然后取消引用它。因此,假设指针转换顺利,这会将a的位模式解释为指向type2的位模式。

所有这些都是奇怪的东西,而后者最终具有未定义的行为。由于&a不是字符类型,因此有效类型规则表示您不能通过与其有效类型不同的类型访问此对象。因此,反引用此指针是错误的。