昨天写的题目,在VC6.0上面测试一下
一道内存分配的面试题
结果发现一个问题,发现输出结果竟然没有问题,我很慌,如果这样的输出结果没有问题的话,那肯定是跟我们的理论对不上号的。
所以我只能继续调试
先把问题抛在printf上,怀疑printf输出是有问题的,基于这个猜测,我自己写了一个printf函数。
#include "stdafx.h"
#include "stdio.h"char * pg =NULL;void test_printf(char * pch)
{while(*pch != 0)putchar(*pch++);putchar('\n');
}char * test_function(int n)
{int a = 3;char *p1 = "123";char p2[] = "456";pg = (char *)p2;printf("%p %p %p\n",&a,p1,p2);if(n == 0)return p1;return pg;
}int main(int argc, char* argv[])
{test_printf(test_function(1));test_printf(test_function(0));printf("%s\n",(char *)0x0019fecc);printf("%s\n",(char *)0x0019fecc);return 0;
}
0x0019fecc
这个地址每个人程序会不一样,不要照抄。
程序输出
如果使用默认的printf输出,这样的代码
#include "stdio.h"char * pg =NULL;char * test_function(int n)
{int a = 3;char *p1 = "123";char p2[] = "456";pg = (char *)p2;printf("%p %p %p\n",&a,p1,p2);if(n == 0)return p1;return pg;
}int main(int argc, char* argv[])
{printf("%s\n",test_function(1));printf("%s\n",test_function(0));return 0;
}
输出没有问题
这时候我们只能进行单步调试了
注意单步调试的最后一步,在test_function退出的时候,p2地址0x0019fecc地址的内容已经改变,但是经过printf调用后,这个地址的内容就被取走了。然后再调用一次就出问题了。
在第一次函数执行结束后,0x0019fecc地址的值还是 456。
但是在执行printf之后,0x0019fecc中的内容就被改变了,如下图
推荐阅读:
专辑|Linux文章汇总
专辑|程序人生
专辑|C语言
我的知识小密圈
关注公众号,后台回复「1024」获取学习资料网盘链接。
欢迎点赞,关注,转发,在看,您的每一次鼓励,我都将铭记于心~
嵌入式Linux
微信扫描二维码,关注我的公众号