指针参数根据输出而变化
pointer aritmetic changes depending on output?
我有这两个几乎相同的 c++
#include <iostream>
using namespace std;
int main(){
int a = 0;
int b = 1;
int c = 2;
int d = 3;
int *p = &a;
cout << &c << endl;
cout << *(p+1);
}
输出:
0x7ffd7b16998c
阿拉伯数字
和
#include <iostream>
using namespace std;
int main(){
int a = 0;
int b = 1;
int c = 2;
int d = 3;
int *p = &a;
cout << &d << endl;
cout << *(p+1);
}
生成输出:
0x7ffdb7ea105c
3
为什么 *(p+1) 的值取决于我事先输出的内容?如果我删除该行
cout << &c << endl;
我完全得到预期的 1 作为输出。
到底发生了什么?
正在发生的事情是未定义的行为。
当你获得指向int
的指针时,你可以单独使用该指针的值;指针算术是没有意义的。
为了使p+1
生成可以取消引用的地址,p
必须指向数组元素,而不是其最后一个元素。在所有其他情况下,读取*(p+1)
是未定义的。
撇开标准不谈,CPU必须从某个地方获取该值。你假设这个地方必须是 b
的地址,它紧跟在 a
之后声明。但是,C++ 不保证内存中局部变量相对于彼此的位置。编译器似乎对您的变量重新排序,产生您意想不到的输出(无论如何它都是未定义的)。
*(p+1)
a
后访问内存,因此它是未定义的行为。
您可能打算(*p)+1
将a
增加 1?
相关文章:
- 递归函数计算序列中的平方和(并输出过程)
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 请解释"函数1(p1,p2,p3);"的输出
- C++:将控制台输出存储在宏中更好吗
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 为什么我的代码在输出中增加了93天
- 如何从void函数输出字符串
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- AES加密到解密未正确输出
- 如何将c++程序的一些输出传递给shell,以便在shell中使用
- 使用C++程序合并排序没有得到正确的输出
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 为什么我的程序输出不断变化?EAX寄存器不断更改值
- 指针参数根据输出而变化
- 当在函数内部使用静态变量时,输出会发生变化,该函数在c++中返回引用
- 8 皇后区变化 - 安排回溯实施的数量 - 错误的输出
- 是硬币变化算法,输出仍可由DP解决的所有组合
- 我无法理解为什么从子类中删除变量后输出会发生变化
- 循环中字符串的输出会根据是否满足某个条件而变化