当我们从/tp地址中添加/减去一个整数时会发生什么
What happens when we add/substract an integer from/tp an address
int m=44;
int* p= & m;
int* q = p-1
那么p是一个地址,我们如何从中减去1?q和*q 的输出是多少
此
int m=44;
在32位系统上如下图所示
0x103 0x102 0x101 0x100 (lets assume m base address is 0x100)
----------------------------------------------
| 0000 0000 | 0000 0000 | 0000 0000 |0010 1100 |
----------------------------------------------
m
MSB LSB
当你喜欢时
int *p = &m;
指针变量CCD_ 1指向CCD_
0x103 0x102 0x101 0x100
----------------------------------------------
| 0000 0000 | 0000 0000 | 0000 0000 |0010 1100 |
----------------------------------------------
m
|
p <-- points to 0x100
这个
int* q = p-1;
整数指针被分配了无效的p-1
,如下所示
0x107.................0x104 0x103 0x102 0x101 0x100
---------------------------------------------------------------------------
| un-initialized memory | 0000 0000 | 0000 0000 | 0000 0000 |0010 1100 |
---------------------------------------------------------------------------
<--q p
因此,如果您尝试执行*q
,它将尝试向前提取未为q
保留的数据0x104
,这将导致分段错误&导致未定义的行为。
好的,那么p是一个地址,我们如何从中减去1您可以执行q = p - 1
,因为这样做是将一个地址分配给它需要的q
,但重点是它不是有效地址,因此当您执行q
时,它崩溃了。例如
int main(void) {
int m=44;
int *p = &m;
int* q = p-1;
printf("%pn",(void*)q); /* this is valid */
//printf("%d n",*q); /* this cause seg fault */
return 0;
}
C++标准在[expr.add]/4:中对此进行了解释
将具有整型的表达式添加到指针或从指针中减去时,结果具有指针操作数的类型。如果表达式P指向具有n的数组对象x的元素x[i]元素,(…(表达式P-如果0≤i−J,J指向(可能是假设的(元素x[i−J]≤n否则,行为未定义。
因此,在您的情况下,行为是未定义的,因为p不指向数组。
在实践中,在大多数主流编译器上,q只会指向m之前的某个内存位置p
0字节。但由于该标准对内存布局没有太多说明,因此它可以位于任何位置。取消引用q可能会导致从垃圾值到segfault或内存损坏的任何奇怪行为
int m=44;
int*p=&m;
int*q=p-1
这里,q指向m之前的块,它是未初始化的。所以q会给出m-sizeof(int(的地址,*q会给你垃圾(值bw-(2^32(/2&(2^32(/2-1(。
相关文章:
- C++需要帮助从用户那里获得一个整数,并确保它在另外两个整数之间
- 当我们从/tp地址中添加/减去一个整数时会发生什么
- 如何将一个数组值合并为一个整数c++
- 为什么有时我输入一个整数,程序将第一个输入的数字打印成十进制数?
- 给定一个整数数组,需要在Max_Heap上运行操作。得到错误"segmentation fault",有什么想法吗?(C++)
- 我可以将迭代器递增一个整数吗?
- 有没有办法生成一个包含平方的序列,这些平方加起来就是一个整数平方?
- 为什么将两个浮点数相加会得到一个整数C++?
- 如果我们在其中输入一个整数,则字符会给出整数作为输出,但是当分配给它一个整数时,这不会发生。为什么?
- 给枚举一个整数,并在 C++ 中将其相关值作为字符串获取
- 按升序输出整数时,将最后一个整数放在新行上
- 编写一个程序,提示用户输入一个整数,然后输出数字的单个数字和数字的总和
- 给定一个整数 N>0,区间 [0, 2^N) 中有多少个整数正好有 N-1 个设置位?编写一个返回正确答案的简短函数
- 给定一个整数,将其表示为平方和
- c++interpret_cast是一个整数
- 以最少的步骤将给定整数转换为另一个整数
- 当 map 是一个整数数组并且由 operator[] 创建时,它是否初始化其映射类型
- 我需要将字符串(例如 A5)转换为一个字符串 (A) 和一个整数 (5)
- 如何交替从文件中获取一行数据和一个整数?
- 如何让这个C++代码从用户那里读取五个整数而不是一个整数?