您当前的位置: 首页 >  面试

一道内存分配的面试题后续

发布时间:2021-06-09 08:01:29 ,浏览量:0

昨天写的题目,在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

微信扫描二维码,关注我的公众号

关注
打赏
1688896170
查看更多评论

暂无认证

  • 0浏览

    0关注

    106358博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文
立即登录/注册

微信扫码登录

0.3124s