临时指针问题:delphi 与c++ 指针的区别(50)

  • 主题发起人 主题发起人 々飞翔鸟々
  • 开始时间 开始时间

々飞翔鸟々

Unregistered / Unconfirmed
GUEST, unregistred user!
先给出delphi的例子:返回结果是正确的function a():PChar;var s: PChar;begin s := 'abcdefghi'; result := s;end;procedure TForm1.Button1Click(Sender: TObject);var str: PChar;begin str := a(); Application.MessageBox(str,'te');end;下面给出C++的例子:#include<iostream>using namespace std;char *f();char *f1();int main(){ cout << f() << endl; cout << f1() << endl; return 0;}char * f(){ char s[] = "Hello"; return s;}char *f1(){ static char s[] = "World" ; return s;}第一个打印的是乱码,因为s是局部变量,离开f则释放空间第二个打印正确,因为s是静态变量,整个文件范围类都存在谁能解释一下为什么Delphi返回临时指针的结果是对的呢?
 
s:没有申请空间。function a():PChar;var s: PChar;begin getmem(s,10); s := 'abcdefghi'; result := s;end;
 
查看汇编吧。
 
function a():PChar;var s: PChar;begin s := 'abcdefghi'; result := s;end;procedure TForm2.Button1Click(Sender: TObject);var str: PChar;begin str := a(); Application.MessageBox(str,'te');end;函数a中s固然是临时变量,但是它指向的数据'abcdefghi'确是一个常量,离开函数s虽然不存在了,但是'abcdefghi'这个常量是存在的.而返回值返回的就是这个常量的地址常量是编译的时候就写在PE文件中的,关于字符串常量的保存位置微软一般是放在只读的数据段中,而Borland的编译器通常放在代码段,紧跟在使用这个常量的函数的后面.呵呵.有兴趣的话,你可以查看一下内存的分布.
 

Similar threads

A
回复
4
查看
151
awfigsk
A
F
回复
8
查看
297
flydream0428
F
回复
9
查看
263
秋之叶
C
回复
9
查看
220
chuQingSheng
C
回复
16
查看
272
blackbook
B
后退
顶部