char b = 'a';
int *a = (int*)&b;
std::cout << *a;
*a
的内容可能是什么?它显示了垃圾价值。你能解释一下吗?为什么呢?
答案 0 :(得分:9)
假设char在内存中占用一个字节,int占用两个字节(确切的字节数取决于平台,但通常它们对于char和int不相同)。您将QModelIndex
设置为指向与a
相同的内存位置。如果b
解除引用,则只考虑一个字节,因为它的类型为char。如果b
解除引用将访问两个字节,因此将打印存储在这些位置的整数。这就是你得到垃圾的原因:第一个字节是a
,第二个字节是随机字节 - 它们一起给你一个随机整数值。
答案 1 :(得分:0)
使用数据类型char
初始化变量...
c ++中的char
应该有1个字节,而int
应该包含2个字节。您的a
指向b
变量的地址...地址应定义为任何十六进制数字。每次调用此“程序”时,都应该有任何其他十六进制数字,因为如果您启动此程序,调度程序会为您的变量分配任何其他地址。
答案 2 :(得分:0)
根据字节顺序,第一个或最后一个字节应为十六进制61。其他三个字节是垃圾。最好将int更改为unsigned int并将cout更改为hex。
我不知道为什么有人会这样做。
答案 3 :(得分:0)
将其视为字节块。 Char有一个字节块(8位)。如果设置转换(int *),则从char的地址获取下一个7字节块。因此,您将获得7个随机字节块,这意味着您将获得一个随机整数。这就是你获得垃圾价值的原因。
答案 4 :(得分:0)
代码调用未定义的行为,垃圾是一种未定义的行为,但是你的程序也可能导致系统违规并导致崩溃并产生更多后果。
int *a = (int*)&b;
使用int
的地址初始化指向char
的指针。取消引用此指针将尝试从该地址读取int
:
sizeof(int)
个字节,则其中只有一个将是a
,(0x61
为ASCII),但其他有未确定的值(又名垃圾)。事实上,在某些体系结构中,从未初始化的内存中读取可能会导致问题:例如,在valgrind
下,这将导致向用户显示警告。以上都是推测,未定义的行为意味着任何事情都可能发生。