使用API时,对于变参的PChar和常参的PChar,使用什么样类型的变量调用好,不用手工分配,释放内存(100分)

  • 主题发起人 主题发起人 Aray
  • 开始时间 开始时间
A

Aray

Unregistered / Unconfirmed
GUEST, unregistred user!
一个函数中,有一个常参的PChar,如果传过去一个字符数组,在函数中对<br><br>PChar的赋值是否会改变字符数组中的内容。我写了个函数测试时,结果没有<br><br>改变数组中的值。那在这样的函数中pch := '12345'会造成什么后果。是否会有<br><br>内存泄漏,还是改变了未知区域的值。<br><br>如果是变参的PChar,就不能传一个字符数组吗?
 
不会,因为那个值是复制过去的,自动会销毁<br>不能传一个字符数组,只能传指向他它的指针
 
我也有一个疑团未解;在dll中定义的返回值为pchar类型并且执行result:='';<br>为什么在调用时<br>if functionxx(...)&lt;&gt;'' then<br>这个条件还会进入呢<br><br>如果要分的话,我会给的
 
procedure A(pch: PChar);<br>begin<br>&nbsp; pch := 'aaa'; &nbsp;// ???<br>end;<br><br>procedure AA(pch: PChar);<br>begin<br>&nbsp; pch[0] := 'a';<br>&nbsp; pch[1] := 'a';<br>&nbsp; pch[2] := 'a';<br>end;<br><br>procedure B;<br>var<br>&nbsp; ch: array[0..32] of char;<br>begin<br>&nbsp; ch := '1234567890';<br>&nbsp; A(ch); &nbsp; //此处ch中的内容并未改变<br>&nbsp; ShowMessage(ch); &nbsp; //'1234567890'<br>&nbsp; AA(ch); &nbsp;//ch已被改变<br>&nbsp; ShowMessage(ch); &nbsp; //'aaa'<br>end;<br><br>过程A和AA有什么不同? 又<br>procedure AAA(var pch: PChar);<br>用AAA(ch),编译时会出错,强制转换也不行。为什么?<br>Help中说,PChar相当于C中的char * ;<br>希望各位大侠,能解我的心头疑惑
 
》Aray:<br>  你自己调试一下,一步步执行程序,观察一下变量嘛。我没得时间帮你调试,猜测着说几句。<br><br>耶,好像AAA过程贴掉了。<br><br>PChar 相当于 char *,如果你对C熟悉,这个问题你就明白了。我用汇编来讲,希望你懂:)<br><br>首先,过程B对A和AA的调用部分翻译为汇编<br>&nbsp; &nbsp; push ch &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;;压入堆栈的ch的地址,数组第一个元素的地址<br>&nbsp; &nbsp; call A<br>.................<br>&nbsp; &nbsp; push ch<br>&nbsp; &nbsp; call AA<br><br>过程A的语句pch:='aaa';翻译的汇编语句大概是:<br>&nbsp; &nbsp; const1 db 'aaa'<br>&nbsp; &nbsp; mov pch,const1<br>(pch和const1实际上都是堆栈里面的空间,真实的机器代码是[bp+nnnn])<br><br>过程AA的语句pch[0]:='a';翻译的汇编语句大概是:<br>&nbsp; &nbsp; mov bx,pch<br>&nbsp; &nbsp; mov [bx+0],'a'<br><br>可以看出,在过程A中,在语句pch:='aaa'执行以后,过程A里面pch的值肯定是'aaa'了,<br>因为指针指向了新的地址,但是这个新的地址没有返回給调用过程B的ch,也不可能返回<br>(因为数组是指针常量),所以主过程里面ch的值并没有改变,因为ch(实际上是地址)<br>存储空间的内容没有改变。<br><br>在过程AA中,在语句pch[0]:='a'执行以后,调用它的过程B里面的ch的值也没有改变,<br>当然还是不可能改变,因为是常量,但是过程AA通过pch对ch地址的应用,改变了指针<br>pch指向的内存的内容,也就改变了过程B的常量指针ch指向的内存的内容。
 
噢,指针没变,但指针指向的内容变了
 
谢谢光子,我明白了
 
几天没来,问题已经被人答去了,唉~<br>补充一句把<br>不知你注意过没有,你的那段程序在编译后,没有一个蓝点停在pch := 'aaa'那一行?<br>跟踪一下汇编代码就会发现者一句Delphi根本就没有编译它!<br>pch是一个指针,pch:='aaa'是把'aaa'所在的内存区域的指针付给pch,当然不会改变原值<br>而在你的这个例子中,如果要实现对pch的赋值,就要用strcopy(pch,'aaa'),这才是对pch所指向内存的操作<br><br>
 
后退
顶部