📄 subject_41463.htm
字号:
<p>
序号:41463 发表者:尼克.高 发表日期:2003-05-27 11:14:50
<br>主题:关于指针的一个很好的问题!
<br>内容:char * GetMemory(void)<BR>{ <BR> char p[] = "ld";<BR> return p;<BR>}<BR>void Test(void)<BR>{<BR> char *str = NULL;<BR> str = GetMemory(); <BR> printf(str);<BR>}<BR><BR>main()<BR>{<BR> Test();<BR>}<BR>最后结果出现了乱码!请问为什么?3x
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:罗兹维尔 回复日期:2003-05-27 11:29:09
<br>内容:返回一个临时变量的指针当然不行啦
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:尼克.高 回复日期:2003-05-27 15:10:21
<br>内容:但是我在编也这段程序的时候,当执行完str = GetMemory(); <BR>后用watch窗口察看,str和getMemory()都是在同一地址,并且地址中的<BR>值都是"ld",当再执行sprintf(str);后watch窗口中str和geMemory()的值同时变成了相同乱码!这是为什么呢?我看不是临时变量指针的问题吧!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:成龙 回复日期:2003-05-27 18:53:10
<br>内容:我同意showboat的观点,那是,到下一语句你看一下,你要知道<BR>p[]在调用完以后就释放了空间啊,那你的指针指的是一个值不能预料<BR>的内存<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:罗兹维尔 回复日期:2003-05-28 22:19:22
<br>内容:char *str 的生存期是:<BR><BR>char * GetMemory(void)<BR>{ <BR> char p[] = "ld"; //const* p birth<BR> return p;<BR>} //death<BR><BR>所以当你单部的时候<BR><BR> char *str = NULL;<BR> str = GetMemory(); // *str 还活着 <BR> printf(str); // str 指向的区间内容已经不可预测
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:zhang2003 回复日期:2003-05-31 12:45:20
<br>内容:我的观点<BR>char * GetMemory(void)<BR>{ <BR> char p[] = "ld"; //const* p birth<BR> return p;<BR>} //death<BR><BR>所以当你单部的时候<BR><BR> char *str = NULL;<BR> str = GetMemory(); // *str 还活着 <BR> printf(str); <BR> //执行printf这个函数时已经用printf的参数将GetMemory释放出的空间覆盖了
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:zhang2003 回复日期:2003-05-31 13:07:58
<br>内容:详细一点<BR>编译器在编译时<BR>遇到一个函数<BR>它会在调用函数的栈上为其分配一块临时堆栈作为该函数的堆栈,堆栈用来存放参数\返回地址\局部变量调用完后会释放它<BR>在上面的调用中str = GetMemory();调用完后释放了<BR>但在下一次函数调用前该内存一般不会被破坏(但不一定)<BR>当调用 printf(str); 时由于该内存被分配给了printf函数,参数\返回地址\局部变量就会覆盖掉它们
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:zhang2003 回复日期:2003-05-31 13:19:27
<br>内容:char * GetMemory(void)<BR>{ <BR> char p[] = "ld";//一、改成char *P = "ld"就可以了但不好因为这依赖于赋值方式,只有用""赋值才可行二、改为char *P=NEW CHAR[3];p = "ld";也可以,只要你没有DELETE它就一直不会被破坏<BR>但要记得释放它<BR> return p;<BR>}<BR>void Test(void)<BR>{<BR> char *str = NULL;<BR> str = GetMemory(); <BR> printf(str);<BR>}<BR><BR>main()<BR>{<BR> Test();<BR>}
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:zhang2003 回复日期:2003-05-31 13:48:36
<br>内容:char * GetMemory(void)<BR>{ <BR> char p[] = "ld";//一、改成char *P = "ld"就可以了但不好因为这依赖于赋值方式,只有用""赋值才可行为什么呢<BR>因为啊<BR>""中的内容是被编译器当作常量来看待的,被放置在内存的常量区在程序的整个运行期间都不会被改变<BR>不信你试试下面的代码<BR>CHAR *P="ASSD";<BR>P[1]='O'//肯定在运行时出错常量区是不能修改的<BR>(通过服务器中转)
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:海客 回复日期:2003-05-31 14:02:19
<br>内容:#include "stdio.h"<BR>main()<BR>{char *p="asds";<BR> p[1]='t';<BR> printf("%s\n",p);<BR>}<BR>那这里为什么可以改呢?
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:zhang2003 回复日期:2003-05-31 18:26:43
<br>内容:楼上的同志:<BR>我用的是VC6.0<BR>请问你是用VC还是TC呀
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:zhang2003 回复日期:2003-05-31 18:31:40
<br>内容:你用的是TC3.0<BR>对不起我应该说明环境
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:zhang2003 回复日期:2003-06-01 13:23:21
<br>内容:堆分配的机制是不一样的啊
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:海客 回复日期:2003-06-01 16:24:40
<br>内容:I see,
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:ArthurTu 回复日期:2003-06-01 21:14:50
<br>内容:见了n多的人问这种问题。。。<BR>真是。。。晕。。。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -