char s[30]和char *s=new char[30]的区别?????

woos 2004-07-24 04:28:00
以下面的程序为例:


char *f()
{
//
//char s[30];------------------1
//char *s=new char[30];---------2
sprintf(s,"%s","f() called.");
return s;
}


void main()
{
cout<<f()<<endl;
}




若是用标2的语句,输出的是“f() called.";
若是用1号语句,则输出一串乱码。

为什么?在C中,char *s和char s[30]的区别在哪?
编译器是怎样处理的?为什么和其它类型的数组大不相同?
...全文
223 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
woos 2004-07-25
  • 打赏
  • 举报
回复
谢谢各位指点,明白了。
elvahuang 2004-07-24
  • 打赏
  • 举报
回复
char s[30];
是在栈中进行的分配,在该函数返回后要被释放的!!!
原因可以看看汇编
char *s=new char[30];
是在堆中进行的分配,在该函数返回后是不用被释放的,释放用delete哦!!!


RookieStar 2004-07-24
  • 打赏
  • 举报
回复
就是飞艇说的原因。

另一种解决办法:
char *f(char *s)
{
sprintf(s,"%s","f() called.");
return s;
}


void main()
{
char s[30]; //-----1
//char *s=new char[30]; //-----2
cout<<f(s)<<endl;
}
kaphoon 2004-07-24
  • 打赏
  • 举报
回复
尽管你的意思是“释放”,但是会引起楼主的误解的~~
kaphoon 2004-07-24
  • 打赏
  • 举报
回复
关键你返回了局部变量的指针
假如用你第二种方法也不好,会造成内存泄漏,可以用static来解决


to 楼上的:
不是free,是delete[] ptr;
yesdo 2004-07-24
  • 打赏
  • 举报
回复
如 redleaves(ID最吊的网友)所说:
char s[30]是你定义的局部字符数组,既然是局部变量,那就符合局部变量的规则,当函数执行结束,就自动释放局部变量的内存空间,而你在主函数中要输出这个已不在的变量,就输出内存中随机值。可能就是乱码了!
new char[30]为动态的分配堆空间,记住是在堆中分配,要自己手动释放,而且是必须的,不然会引起堆内存的泄漏。也就是空间的浪费。所以一般在程序结束后都要free!
要是你不想申请堆内存,可以申明个全局变量,在主函数前申明char s[30]也是可以的。
在内部申明就和redleaves说的,申明为静态函数static char s[30],静态函数的生命期和程序是一样的,在程序结束时才释放空间!
在这里一定要记的 free 堆空间!重要!
redleaves 2004-07-24
  • 打赏
  • 举报
回复
new char[30]是动态分配内存,要你自己释放.它在f()运行结束后还是存在的.
但char s[30]就是静态分配了,是编译器在栈中分配的,当函数运行结束后,栈已经释放,所以输出的就是乱码了.
如果想用char s[30]这种方式,你可以在前面加一个static.
如果用new的方式,你就要在用完后delete内存

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧