c++ - 多久*投工作

标签 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(long)

但事实并非如此。此代码打印总是 -858993460

这个数字是多少,为什么它不是随机的?

我显然缺乏了解正在发生的事情的知识,所以如果你能给我提示或其他东西,我将不胜感激!

最佳答案

What is that number and why it isn't random?

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

就您运行程序而言,它恰好是一致的。也许你还没有运行它足够。使用未初始化的内存会产生未定义的行为。带有 UB 的程序可能会按预期运行多年,然后无法编译。

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

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

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

关于c++ - 多久*投工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25579681/

相关文章:

c++ - 将调用线程置于可警告等待状态

c++ - 动态分配的数组只显示最后的结果

c++ - 输出指向调用者 SAL 错误的指针

c - 与 c 中的指针相关的问题

c++ - 抛出异常 : write access violation. newNode 为 nullptr

c - 在字符串中查找动词

c++ - C++ 中的 __builtin__functions 有什么用?

c++ - std::cout 会影响编译结果吗?

c++ - 替换给定迭代器的 std::list 对象

c++ - 指向数组的指针是否指向数组的第一个元素