*演员有多长时间

时间:2014-08-30 06:28:42

标签: c++ pointers

所以我有这段代码

char buf[2];
buf[0] = 'a';
buf[1] = 'b';

std::cout << *((long *)((void*)buf) + 1) << std::endl;

当我看到我对自己说:

我们有内存地址1000(例如),这是buf [1]的地址。 所以我认为*((long )((void )buf)+ 1)将打印出地址中的任何内容: 从1000到1000 + sizeof(长)

但事实并非如此。此代码打印始终 -858993460

这个号码是什么以及为什么它不是随机的?

我显然缺乏了解正在发生的事情的知识,所以如果你能给我一些提示,我会很感激!

3 个答案:

答案 0 :(得分:3)

  

这个号码是什么以及为什么它不是随机的?

这是一个随机值。程序中没有任何内容表明应该打印出值。

只要您运行程序,它就会一致。也许你还没有运行它。使用未初始化的内存会产生未定义的行为。具有UB的程序可能会按预期工作多年,然后无法编译。

顺便说一句,你的表达并没有预期的含义。尝试添加更多空格。

* ( (long *) ((void*)buf) + 1 )

首先你将buf转换为void *,然后再将其转换为long *,然后添加一个(获取下一个long,而不是下一个字节) ,然后从内存中获取long。打印的字节完全在char[2]数组之外。

答案 1 :(得分:1)

此代码正在读取缓冲区的末尾,因此存在安全风险和完全未定义的行为。

buf以外的内存内容可以是任何

您的编译器,体系结构和/或构建设置可能是这样的,每次运行时该值都是相同的,但这只是盲目的机会,并且可能随时发生变化。

long为64位宽的64位系统上会再次出现不同。对齐规则也可能导致此代码彻底失败。

总结:即使这段代码现在为每次运行返回相同的结果,但这完全是不安全和未定义的行为。

避免的。

答案 2 :(得分:1)

在特定时刻,特定内存地址中的值将保持不变,除非创建其他变量并将其置于其中。在您的程序中,如果输出buf的内存地址,它将是相同的。这意味着每次运行程序时都会引用相同的地址,因此会打印相同的垃圾值。