帝国谜情by璇儿百度云:有关内存问题

来源:百度文库 编辑:高考问答 时间:2024/05/09 19:20:21
请看一下程序:

#define NULL 0
void getmemory(char *p)
{
p=(char *)malloc(100);
}
void test()
{
char *str=NULL;
getmemory(str);
strcpy(str,"hello");
printf(str);
}
main()
{
test();
getch();

}

林锐博士解释说该程序会崩溃,因为getmemory()并不能传递动态内存,str在test()中一直都是null。但是我将这个程序运行多次都能正常运行呀??!!!从未崩溃过,其高手解释一下,这个程序问题在那里???尤其是getmemory()。
感谢 回答者:丁丁爱璐璐 - 助理 二级 6-30 08:50 的回答,但是我试着将内存释放,程序仍未崩溃,请哥们再解释一下,谢谢!!!
也感谢 回答者:湛蓝水晶 - 大魔法师 八级 6-30 11:26 的回答,对哥们的解释我明白了,不过我又试着将strcpy(str,"hello")中的"hello"换成了很长的字符串,程序还是正常结束,没有意外,是不是机子性能高就不容易崩溃,请哥们再解释一下!!!谢谢!

问题在这里呀
void getmemory(char *p)
{
p=(char *)malloc(100);
}
然后在后面调用getmemory(str)
问题是形参不改变实参。即p=(char *)malloc(100); 只是给getmemory的局部变量(形参)分配了空间,而实参str依然是指向NULL,你也行多次运行不崩溃,试着将strcpy(str,"hello")中的"hello"换成长一点的字符串,也许就崩溃了(程序崩溃这回事说不准的)
要改的话应该这样

getmemory(char **p)
{
*p = (char *)malloc(100);
}
同时相应的要有一个函数负责释放内存
freememory(char **p)
{
free(*p);
}
最后要将test也相应修改
void test()
{
char *str=NULL;
getmemory(&str); //注意传址调用
strcpy(str,"hello");
printf(str);
freememory(&str(; //用完要释放
}

哥们,我这里程序崩了,是在strcpy(str,"hello");的时候崩的,跟踪发现,str此时是空的,也就是申请的空间没有挂在它名下,所以把hello往一个空指针上复制的时候崩了。要不你按照另一个哥们说的那样改改试试,我这里确实是崩了^_^

你是什么版的程序啊,RELEASE 还是DEBUG啊,如果是DEBUG的话程序有可能自己去容纳下这个错误,林锐博士也是说了一种经典的错误,并不是一种绝对的情况。