所以,我有一项需要帮助的作业。 我得到了一个名为foo()的函数和一个名为recover()的函数的代码。我无法改变foo的代码,并且recover不能有任何参数,也不会返回任何参数。
这样做的目的是让恢复从foo中获取局部变量并打印出来。
示例:
long foo(long a, long b, long c, long d, long e){
long x, y, z;
if(e < 0)
{
recover();
return a;
}
//do various things with a, b, and c, and store in x, y, and z respectively
return foo(x,y,z,d+1,e-1)+a+b+c+d+e;
}
void recover(void)
{
//What goes here to get the values?
}
recover()应该做的是从foo()的EACH调用中获取a,b和c值并将其打印出来。我也知道全局变量不允许出现这个问题。
感谢您对此问题的任何帮助。
答案 0 :(得分:2)
警告:以下代码高度依赖于编译器/体系结构且不兼容。使用它需要您自担风险。
局部变量存储在堆栈中,因此您可以通过自己声明局部变量并移动来获取父函数的局部变量。
首先为您的变量添加一些易于识别的值(稍后您将删除它们)
long foo(long a, long b, long c, long d, long e){
long x=11111, y=22222, z=33333;
...
可能你正在使用PC,因此你的堆栈会逐渐减少,你的目标也会在堆栈中上升。只要环顾四周,直到找到它们:
void recover(void)
{
long p;
long *q = &p;
for (int i=0; i < 20; ++i)
{
printf("%d -> %ld\n", i, q[i]);
}
}
或者你可以使用调试器!
答案 1 :(得分:0)
听起来像堆栈黑客练习。
尝试定义一个局部变量,获取地址,然后修改该地址以进入堆栈(添加或减去,具体取决于您的机器),直到您最终指向调用函数中的变量。
这是非常依赖系统的,所以你需要做一些游戏才能搞清楚。我建议用一组已知的参数调用<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TableRow
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/TextView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<ImageView
android:layout_width="33dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:layout_marginRight="15dp"
android:src="@drawable/nextarrow" />
</TableRow>
</LinearLayout>
,并专门查看这些值,以确保您找到正确的位置。一旦你搞清楚了,你就可以获得foo
的任何调用值。