bywfssl
2017-08-02 09:09
采纳率: 42.9%
浏览 1.3k
已采纳

C语言面试真题:请问以下代码输出什么结果?

 #include <stdio.h>
#include <string.h>
char *RetMemory(void)
{
    char p[]="hello world";
    return p;
}
void test(void)
{
    char *str=NULL;
    str=RetMemory();
    printf(str);
}
void main()
{
    test();
}

答案是不能输出正确结果,但是为什么不能输出正确结果啊,怎么修改才能出现正确结果呢?

  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

8条回答 默认 最新

  • 战在春秋 2017-08-02 12:56
    已采纳

    怎么修改才能出现正确结果呢

    不能得到正确结果的原因是因为 p 是定义在栈上的局部变量,
    当函数结束时,p所占内存空间会被释放,此时p指向未知区域,因此不能得到正确的结果。

    楼主还没看到malloc,最简单可行的修改方法是:

     static char p[]="hello world";  //加上static修饰符,p为静态变量,其生存期为定义处到程序结束。
    

    关于如何返回函数的局部变量,强烈推荐这篇博客,讲得很详细。
    博客中也讲了malloc的用法。

    http://blog.csdn.net/jackystudio/article/details/11523353

    如果对您有帮助,请采纳答案好吗,谢谢!

    已采纳该答案
    评论
    解决 无用
    打赏 举报
  • WildStark 2017-08-02 09:21

    输出应该是printf("%s",str);吧

    评论
    解决 无用
    打赏 举报
  • hucongWh 2017-08-02 09:31

    输出应该是 *str , str是指针地址

    评论
    解决 无用
    打赏 举报
  • ZeanZhang 2017-08-02 09:36

    RetMenory 函数返回的是p这个局部变量的地址。当函数结束时,栈中的数据就被清理掉了,无法返回正确结果。

    正确做法是 给 p分配内存地址,然后返回首地址

    #include
    #include "malloc.h"//malloc()函数被包含在malloc.h里面
    #include
    char *RetMemory(void)
    {
    //char p[]="hello world";
    //return p;

    char* p = (char*)malloc(20*sizeof(char));//使用malloc分配内存的首地址,然后赋值给p

    if(!p)//如果malloc失败,可以得到一些log
    {
    perror("malloc");
    return NULL;
    }
    sprintf(p,"%s","Hello World\n");//"HelloWorld\n"写入p指向的地址
    return p;

    }
    void test(void)
    {
    char *str=NULL;
    str=RetMemory();
    printf(str);
    }
    void main()
    {
    test();
    }

    评论
    解决 无用
    打赏 举报
  • 薄生 2017-08-02 09:54

    p是一个指针,是指向“hello world”藏身之地的一个指引,RetMemory()返回的是p,str又是一个指针,他指向了p指针的“藏身之地”,得到的不是hello world。不知道这样讲对不对,能不能理解。

    评论
    解决 无用
    打赏 举报
  • das白 2017-08-02 10:01

    楼上有位说的很对的

     char p[]="hello world";
    

    这个函数里的以上变量 执行完就被销毁了 所以说其实你返回的是一个莫名其表的指针
    你想修改可以传递参数 可以声明全局变量
    别在返回一个你在函数里声明的变量 那个变量其实在函数执行完以后就不存在了

    评论
    解决 无用
    打赏 举报
  • vision泉 2017-08-02 13:33

    你不觉得打开电脑dev试一下比在这里问更快吗?学会自己动手找答案。

    评论
    解决 无用
    打赏 举报
  • qq_39545013 2017-08-03 11:19

    其实一楼有点脱裤子放屁了,他这样malloc,没有free掉内存容易造成内存泄漏,简单说就是分配内存但是没有收回,导致可分配的内存减少。但是有一部分说的是对的
    ,就是char p[]="hello world"是在栈内存上分配的内存空间,函数执行完后内存就销毁了。但是也没必要用malloc去在堆上分配空间,其实char * p ="hello world";就可以了,因为“hello world"
    是一个字符串,会分配在常量区,这个区域的值在函数执行结束后是不会销毁的,一定程度上和全局变量一样。而p里面的地址就是这个不会销毁的常量区的地址,所以直接返回这个p就可以了,不知道这么说你明白不,还有一点就是需要在栈区分配个空间留给p这个变量去存放地址,函数结束后分派给p的内存会销毁,但是p内的地址已经返回了,也就是字符串的地址。

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题