回 帖 发 新 帖 刷新版面

主题:[讨论]由面试题目引出的

char *memory(void)
{
    char *p="hello world";
    return p;
}
void main()
{
    char *str=NULL;
    str=memory();
    printf("%s",str);
}
这个程序有没有错呢?

是p[]已经在被调用函数中释放掉了,无法赋给str(标准答案)?那么为什么我调试会没有错误呢,正常的输出“hello world”;高手指点///

回复列表 (共5个回复)

沙发

p只是一个标识,变量释放掉了,但标识的空间没释放,

板凳

自动变量在堆栈中分配内存,当自动变量的函数或代码块退出时,他们所占用的内存便会被回收,他们的内容肯定会被下一次所调用的函数覆盖,或许被立即覆盖,也可能稍后覆盖。(出自于C专家编程)
所以,会正常的输出“hello world”;

3 楼


就这个面试题目来说,答案是对还是错呢?

4 楼

标准答案,我觉得是对的。

5 楼

很垃圾的一道题目。

问题是C类型的字符窜一旦定以后永远占用空间,直到进程结束被操作系统回收资源。也就是说,像这种定义的字符窜,一旦定义以后,任何时候均可以引用,永远不会过期。

由此看来,应该能正常输出。

如果变成下面这样就废了。
char *memory(void)
{
    char p[] ="hello world";
    return p;
}

我来回复

您尚未登录,请登录后再回复。点此登录或注册