- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
#include <stdio.h>
void interrupt();
int main() {
int n = 8;
char c = 'Z';
interrupt();
printf("%d%c\n", n, c);
}
void interrupt() {
printf("Run normally\n");
//ADD CODE...
}
就目前而言,无论 interrupt() 方法做什么,此函数都将输出“8Z”。我试图修改它,使其打印“3Y”而不更改原始主函数中的任何内容,并且仅使用 interrupt() 函数(不允许传递参数!)。我可以在 interrupt() 函数中使用变量,但我很困惑如何在不创建全局变量的情况下获取 'n' 和 'c' 的地址,这会破坏这个问题的目的。由于每次运行时堆栈的地址都会发生变化,因此似乎没有办法进行指针运算(这是我需要做的),因此我有点困惑和卡住了。
最佳答案
免责声明:不要尝试在生产代码中使用它
我把它当作一个谜题并着手解决它。你说你不能修改 main
。我冒昧地稍微修改了 main
—— 以打印 n
和 c
的地址。
int main()
{
int n = 8;
char c = 'Z';
printf("%p %p\n", &n, &c);
interrupt();
printf("%d%c\n", n, c);
}
我还稍微修改了interrupt
,也打印了一个地址的值。
void interrupt() {
int i = 10;
char* np = (char*)&i;
char* cp = (char*)&i;
printf("%p %p\n", np, cp);
printf("%p\n", &i);
}
当我运行程序时,我得到了以下输出:
0x22cb0c 0x22cb0b
0x22cabc 0x22cabc
0x22cabc
8Z
从输出中,我能够计算 main
中的 &n
和 interrupt
中的 &i
之间的偏移量,以及 main
中的 &c
和 interrupt
中的 &i
之间的偏移量。现在我可以操纵偏移量使 interrupt
中的 np
和 cp
指向 n
和 c
在 main
中。
void interrupt() {
int i = 10;
char* np = (char*)&i;
char* cp = (char*)&i;
np += (0x22cb0c - 0x22cabc);
cp += (0x22cb0b - 0x22cabc);
*(int*)np = 3;
*cp = 'Y';
printf("%p %p\n", np, cp);
printf("%p\n", &i);
}
随着 interrupt
的改变,我得到以下输出:
0x22cb0c 0x22cb0b
0x22cb0c 0x22cb0b
0x22cabc
3Y
通过稍微更改 main
完成任务。如果根本不允许更改它,则必须使用不同的程序来计算偏移量。
关于c - 使用指针运算来更改另一个函数中变量的值。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35192231/
COW 不是奶牛,是 Copy-On-Write 的缩写,这是一种是复制但也不完全是复制的技术。 一般来说复制就是创建出完全相同的两份,两份是独立的: 但是,有的时候复制这件事没多大必要
我是一名优秀的程序员,十分优秀!