简单问题关于函数变量生存期....

C员外 2005-08-20 11:41:56
char* p = "12345";
char array[] = "12345";
在一个char* Fun()函数里,为什么返回 p与&array不一样
...全文
79 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
i_noname 2005-08-21
  • 打赏
  • 举报
回复
"c...parray"是静态数据,放在数据区data segment所以不用释放
但是这样的话只可以通过pc指针来获取它的值但是不能改变它
i_noname 2005-08-20
  • 打赏
  • 举报
回复
这个要看编译器怎么做的,有的编译器会合并相同的字符串,但有的不会,所以在不同编译器下结果可能就不一样
char* p = "12345";
char array[] = "12345";
在VC下p和array应该相同。

另外,你使用这个函数的时候小心,因为
char* p = "12345";
char array[] = "12345";
中,"12345"是放在静态变量区而不是在堆里面,也就是说,"12345"的值是固定的不能改变。
如果你想用p或array改变变量的值就会出错!
例如p[0] = 'a'这样的赋值是不允许的
C员外 2005-08-20
  • 打赏
  • 举报
回复
可 char *pc = "c...parray";并不需要释放.那位高人再解释一下?
i_noname 2005-08-20
  • 打赏
  • 举报
回复
没错。如果用了
char *pc = "xxxxx";
就一定要
free(pc);
否则内存泄漏
C员外 2005-08-20
  • 打赏
  • 举报
回复
如果char *pc = new ...or malloc..的话,可以delete/free()的.


C员外 2005-08-20
  • 打赏
  • 举报
回复
char *pc = new ...则在堆上,那么就必须delete/free()否则leak?但就算free(),其还在阿.
应在可执行文件的数据区吧
i_noname 2005-08-20
  • 打赏
  • 举报
回复
GetFromArray中,数组是储存在栈内,函数执行完后数组被释放,所以返回数组名是无意义的。
GetFromPointer中,
char *pc = "c...parray"
等效于
char *pc = new ...
所以有效。
C员外 2005-08-20
  • 打赏
  • 举报
回复
对于返回array在gcc/aCC及vc下都不行的.
char* GetFromArray()
{
char cArray[20] = "c....array ";

return cArray;
}

char* GetFromPointer()
{
char *pc = "c...parray ";

return pc;
}
GetFromArray()函数返回是乱码,而GetFromPointer()没问题,那么pc与cArray开辟的空间在哪里或在那个段位?

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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