以文本方式查看主题

-  计算机科学论坛  (http://bbs.xml.org.cn/index.asp)
--  『 C/C++编程思想 』  (http://bbs.xml.org.cn/list.asp?boardid=61)
----  关于内存分配的小问题  (http://bbs.xml.org.cn/dispbbs.asp?boardid=61&rootid=&id=15826)


--  作者:greenlixiao
--  发布时间:3/19/2005 8:18:00 PM

--  关于内存分配的小问题
问题一:
char *GetMemory(void)
{
        char p[] = "hello world";
        return p;
}
void Test(void)
{
       char *str = NULL;
       str = GetMemory();
        printf(str);
}
请问运行Test函数会有什么样的结果?
结果却是:
returning address of local variable or temporary
但若改成char *p  = "hello world";
则结果为hello world
不知道为什么?

问题二:
void Test(void)
{
    char *str = (char *) malloc(100);
    strcpy(str, "hello");
    free(str);   
    if(str != NULL)      
    {    
        strcpy(str, "world");
        printf(str);
    }
}
请问运行Test函数会有什么样的结果?
结果为:world
发现free之后str还是hello!不知道为什么,指点


--  作者:Lis
--  发布时间:3/31/2005 10:49:00 AM

--  
2005-3-19,到现在没人回答,唉,我说说吧。

问题一:
原始代码有这个结果是正常的。p 是一个指针常量,指向一个字符串常量(其实是一个字符数组),而这个字符串常量(字符数组)是在 GetMemory() 函数里面的,也就是说随着这个函数实例的消亡,这个字符串也会消亡,等你用返回值调用的时候已经不存在了。
如果按照你下面做的那样改一下,p 是一个指针变量,也指向一个常量,但是这个常量不在那个函数里面,而是在程序代码里,在整个程序运行期间不会消失的。

问题二:
结果也是很正常的。(但是这个程序很不正常!)
free 一块 由 malloc 申请的内存时,它只是释放了它原先申请的那块内存,但没有义务将指向它的指针变量清零(NULL == 0)。
这也是很好理解的,如果假设它应该清零,那么为什么呢?你申请了这块内存之后,可能将你的新地址通知了很多变量,那么谁过来释放谁就应该被清零吗?显然是对它不公平的。(还有如果是一个常量过来释放怎么办呢(虽然这种情况几乎是不可能的)?不能清零啊。)

就这些,希望对你有帮助,也希望我说的没错。(!:))
建议你学学编译原理啊之类的。
学一门语言更重要的是理解他的原理的、本质的和思想的东西,而不是学表面的语法用法等等,只要有一本手册,这些东西可以在两天之内学通。


--  作者:Lis
--  发布时间:3/31/2005 10:54:00 AM

--  
补充两句,我说那个程序是“很不正常”的是因为,
当你的内存被 free 掉了之后,那个指针变量已经是一个野指针了,或者说,你指向的位置不是你的地盘了,而你接下来给它 strcpy 是不应该的,是很危险的。
--  作者:greenlixiao
--  发布时间:4/2/2005 3:14:00 AM

--  
非常感谢你!
你说得很好,我明白了
回去好好学习编译原理的东西,多动手多思考
再次感谢!
PS:第二个程序是很不正常,因为这只是一个题目。希望我以后能够尽量不犯这种错误
--  作者:eyounx
--  发布时间:4/2/2005 10:50:00 AM

--  
第一个问题,
前一种方法字符串在堆中,后一种方法字符串在数据区
--  作者:scanf
--  发布时间:4/10/2005 2:50:00 PM

--  
学习
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
250.000ms