通过尝试访问大于其在 C 中的维数的位置来访问数组后的变量
Accessing variable after an array by trying to access a position greater than its dimension in C
因为在这个例子中,由于指针算法,我能够读取 integer2
的值:
#include <stdio.h>
int main() {
int integer1 = 1;
int integer2 = 2;
int *p = &integer1;
p++;
printf("%d\n", *p);
}
输出:
$ ./test
2
我想知道为什么在这个例子中:
#include <stdio.h>
int main()
{
int array[2] = {0, 1};
int variable = 0;
for(int i = 0; i < 3; i++) {
printf("%d\n", array[i]);
}
}
然后我无法读取试图指向下一个整数的变量的值,但这就是我得到的:
0
1
336859392
我尝试打印 &array[0] &array[1] 和 &variable 的值,这就是我得到的:
161695488
161695492
161695480
不仅变量的地址小于数组的第一个元素,甚至连前一个都不如
为什么在第一个示例中变量地址是连续的而在第二个示例中不是?
关于变量和缓冲区在堆栈中的分配方式,我可能有些不明白。
编辑:
我知道不应该这样做,但我正在尝试了解缓冲区溢出(更现实地说,缓冲区应该是字符,由用户输入),目标应该是改变变量的值。所以我想了解的是,是否有可能确切知道变量在内存中的实际位置。
编辑2:
事实证明,提供 -fno-stack-protector 可以使其按预期工作,因此 gcc 默认添加某种保护以避免缓冲区溢出
局部变量的放置是实现的一个细节。它们可以按照它认为合适的任何顺序放置。
尝试越过数组边界读取会调用 undefined behavior。您看到的不一致结果就是这种情况的表现。
例如,如果我 运行 你的第一个代码片段,我 不会 得到 2 作为输出。打印每个变量的地址时,我得到:
&integer1=0x7ffcfa6e8c24, &integer2=0x7ffcfa6e8c20
因此在我的例子中,实现将 integer1
放在 integer2
.
之后
因为在这个例子中,由于指针算法,我能够读取 integer2
的值:
#include <stdio.h>
int main() {
int integer1 = 1;
int integer2 = 2;
int *p = &integer1;
p++;
printf("%d\n", *p);
}
输出:
$ ./test
2
我想知道为什么在这个例子中:
#include <stdio.h>
int main()
{
int array[2] = {0, 1};
int variable = 0;
for(int i = 0; i < 3; i++) {
printf("%d\n", array[i]);
}
}
然后我无法读取试图指向下一个整数的变量的值,但这就是我得到的:
0
1
336859392
我尝试打印 &array[0] &array[1] 和 &variable 的值,这就是我得到的:
161695488
161695492
161695480
不仅变量的地址小于数组的第一个元素,甚至连前一个都不如
为什么在第一个示例中变量地址是连续的而在第二个示例中不是?
关于变量和缓冲区在堆栈中的分配方式,我可能有些不明白。
编辑: 我知道不应该这样做,但我正在尝试了解缓冲区溢出(更现实地说,缓冲区应该是字符,由用户输入),目标应该是改变变量的值。所以我想了解的是,是否有可能确切知道变量在内存中的实际位置。
编辑2: 事实证明,提供 -fno-stack-protector 可以使其按预期工作,因此 gcc 默认添加某种保护以避免缓冲区溢出
局部变量的放置是实现的一个细节。它们可以按照它认为合适的任何顺序放置。
尝试越过数组边界读取会调用 undefined behavior。您看到的不一致结果就是这种情况的表现。
例如,如果我 运行 你的第一个代码片段,我 不会 得到 2 作为输出。打印每个变量的地址时,我得到:
&integer1=0x7ffcfa6e8c24, &integer2=0x7ffcfa6e8c20
因此在我的例子中,实现将 integer1
放在 integer2
.