【笔试】实现函数使程序输出不正常

题目

1
2
3
4
5
6
7
8
9
10
11
12
13
void fun(void)
{
//todo:答题部分。。。
}
int main()
{
int x = 1;
int y = 2;
fun();
printf("x, y%d %d", x, y);
}

问:如何实现函数fun,使得最后的打印结果不是1 2

分析

题目一眼看上去是内存的问题,因为内存改变了打印结果不正常,又涉及到函数调用,堆栈空间的修改,函数调用栈空间是连续的(如图所示),因此可以直接实现。

1
2
3
4
5
6
7
8
9
10
11
12
13
void fun(void)
{
int a = 0;
int *p = &a;
/*
* 搜索到y的位置并修改
*/
while (*p != 2) {
p++;
}
*p = 10;
}

函数A调用函数B的栈中帧结构

img

发散思维

方法一:程序终止
1
2
3
4
5
6
7
8
9
10
void fun(void)
{
int x = 10, y = 20;
printf("x,y%d %d\n", x, y);
/*
* 程序退出
*/
exit(0);
}
方法二:函数屏蔽
1
2
3
4
5
6
7
void fun(void)
{
/*
* 屏蔽printf函数
*/
#define printf
}

说明:#define是预编译指令,在哪个位置都一样


参考:

一道笔试题。求答案