通过C教程学习
#include <stdio.h>
int main() {
short s = 10;
int i = *(int *)&s; // wonder about this
printf("%i", i);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我告诉C该地址s是一个int时,它是否应该读取4个字节?
从2字节的最左侧开始s.在这种情况下,这不是非常危险的,因为我不知道它在读什么,因为短路只分配了2个字节?
如果尝试访问我没有分配/属于我的内存,这不应该崩溃吗?
正如您所指出的,它将读取比实际分配的字节更多的字节,因此它从内存中读取一些垃圾值,而不是由您的变量分配.
实际上它是危险的,它打破了严格别名规则 [详细信息如下]并导致未定义的行为.
编译器应该给你这样的警告.
warning: dereferencing type-punned pointer will break strict-aliasing rules
Run Code Online (Sandbox Code Playgroud)
当你发出警告时,你应该总是听你的编译器.
[详情]
严格别名是由C(或C++)编译器做出的假设,即取消引用指向不同类型对象的指针永远不会引用相同的内存位置(即别名相互作用).
规则的例外是char*,允许指向任何类型.
首先,永远不要这样做。
至于为什么它不会崩溃:因为s是本地的,所以它是在堆栈上分配的。如果short和int在您的架构中具有不同的大小(这不是给定的),那么您最终可能会从与堆栈位于同一内存页上的内存中读取更多字节;所以不会有访问冲突(即使你会读到垃圾)。
大概。