Tag: 铸造

转换指针不会产生左值。 为什么?

在这里发表我最有争议的答案之一后,我敢问几个问题,最终填补了我的知识空白。 为什么不将类型((type_t *) x)的表达式视为有效的左值,假设x本身是指针和左值,而不仅仅是某个表达式? 我知道很多人会说“标准不允许它”,但从逻辑的角度看它似乎是合理的。 标准不允许的原因是什么? 毕竟,任何两个指针都具有相同的大小,指针类型只是一个编译时抽象,指示在进行指针运算时应该应用的适当偏移量。

printf的意外输出

int a=5; float b=3.5; printf(“%d”,b); printf(“\n%f”,a); 任何人都可以告诉我为什么这段代码显示意外的输出(垃圾\ n3.5)

x86上的错误对齐指针

有人提供一个示例是否会因为错位而将指针从一种类型转换为另一种类型失败? 在对这个答案的评论中,两者都表示做了类似的事情 char * foo = …; int bar = *(int *)foo; 如果启用了对齐检查,即使在x86上也可能导致错误。 我在GDB中通过set $ps |= (1<<18)设置了alignment-check标志后试图产生错误条件,但没有任何反应。 工作(即非工作;))示例是什么样的? 答案中的代码片段都没有在我的系统上失败 – 我将尝试使用不同的编译器版本,稍后在不同的PC上。 顺便说一句,我自己的测试代码看起来像这样(现在也使用asm来设置AC标志和未对齐的读写): #include int main(void) { #ifndef NOASM __asm__( “pushf\n” “orl $(1<<18),(%esp)\n" "popf\n" ); #endif volatile unsigned char foo[] = { 1, 2, 3, 4, 5, 6 }; volatile unsigned int bar = 0; bar […]