超低级问题

wensheng_zh2007 2009-12-01 10:32:43

char* GetPoint()
{
char chArr[]="hello world!";
return chArr;

}
char* GetPoint2()
{
char* p="hello world!";
return p;
}

首先,针对上面两个函数,说明那个合法,那个不合法,为什么?
其次,上面的两个函数中的“hello world!”在内存中存放的方式有什么不同。若有,说明原因;
...全文
204 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
hbvanguard 2009-12-02
  • 打赏
  • 举报
回复
都说的很明白了
补充一点:第二种的写法其实没有什么意义,还不如直接把字符串定义为全局变量或者直接定义为宏,拿来就用,没有必要用个函数来返回得到。
  • 打赏
  • 举报
回复
char* GetPoint()
{
char chArr[]="hello world!";
return chArr;

} //返回局部栈上的数据指针,无效
char* GetPoint2()
{
char* p="hello world!";
return p;
} //p是一个指向常量区的指针,可以



jernymy 2009-12-02
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 hairetz 的回复:]
char* GetPoint()
{
char chArr[]="hello world!";
return chArr;

}    //返回局部栈上的数据指针,无效
char* GetPoint2()
{
char* p="hello world!";
return p;
}      //p是一个指向常量区的指针,可以



[/Quote]
bobo364 2009-12-02
  • 打赏
  • 举报
回复
第一个返回了chArr的内存地址,但不是指针,与函数声明不符,第二个可以
Eminas 2009-12-02
  • 打赏
  • 举报
回复
LZ的这个帖子强悍啊,老大都来了~
wolffan3150 2009-12-02
  • 打赏
  • 举报
回复
第一个肯定不合法, 返回了指向函数栈的指针。第一个“hello world”存放在临时的栈上
第二个编码不规范。 最起码应该写成 const char* p="hello world!";

第二个“hello world”存放在常量区

两个hello world会被优化成一个。
amoroso1860 2009-12-02
  • 打赏
  • 举报
回复
写错了,第一个在栈区
amoroso1860 2009-12-02
  • 打赏
  • 举报
回复
都是合法的,第一个在堆区,第二个在文字常量区。
第一个没意义,函数调用完就被释放掉了。至于第二个
8楼说的很有道理。
z569362161 2009-12-02
  • 打赏
  • 举报
回复
两个都不好.
taohua300 2009-12-02
  • 打赏
  • 举报
回复
能力有限,说第二个

让一个指针指向一个常量,语法上是正确的,但却存在严重的隐患,程序执行的时候会把指针指向的地址初始化为 "Hello World" , 如何这部分内存还没有被分配,那这种写法不会造成任何不良后果,但如果是指向了正在运行的程序正在使用的内存,会造成不可预计的后果
wangxipu 2009-12-02
  • 打赏
  • 举报
回复
支持7楼
丈剑走天涯 2009-12-01
  • 打赏
  • 举报
回复
1.char* p="hello world!";
2.char chArr[]="hello world!";
比较1与2
1中P作为一个地址变量,直接指向了Hello World 的首地址

UpdateEveryday 2009-12-01
  • 打赏
  • 举报
回复
第一个肯定不合法, 返回了指向函数栈的指针。第一个“hello world”存放在临时的栈上
第二个编码不规范。 最起码应该写成 const char* p="hello world!";

第二个“hello world”存放在常量区

两个hello world会被优化成一个。
vanchristin 2009-12-01
  • 打赏
  • 举报
回复
两个函数在语法上说都是合法的
char chArr[] = "hello world!"中的"hello world"的存储空间在栈上分配
char *p = "hello world!"中的"hello world"存储在字符常量区
mstlq 2009-12-01
  • 打赏
  • 举报
回复
http://www.ahut.edu.cn/yxsz/slxy/it/c.htm
varding 2009-12-01
  • 打赏
  • 举报
回复
第一函数里的字符串在那个函数的栈上申请的空间,出了这个函数字符串就没了
baihacker 2009-12-01
  • 打赏
  • 举报
回复
第一个用一个string literal初始化了一个字符数组,而字符数组在栈上.
第二个是让一个p指向了具有static storage的string literal的第一个字符,不引起混淆也可以简称这指向这个string literal.

在第一个函数返回的时候,返回了指向这个数组的第一个元素的指针...而数组是在栈上的,函数结束就...WAWA了...
而第二个还是指向那里...

69,364

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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