关于函数返回值的问题

atgameover 2019-01-07 07:52:04
type
Tdata =array [0..3] of byte;

pdata = ^Tdata;

.........

function Myfunc:pdata;
var
data:Pdata;
begin
new(data);
result := data;
end;

function Myfunc:pdata;
var
data:Tdata;
begin
result := @data;
end;

请问,这两种写法的返回值有区别吗?哪个对?
...全文
189 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
minizhuxianchun 2019-01-09
  • 打赏
  • 举报
回复
procedure SetAryHeader(var RevBuffer: Pointer);
var
AryLen,MemSize: integer;
begin
if PHeader(RevBuffer)^.X>0 then
begin
AryLen:=PHeader(RevBuffer)^.X;
MemSize:=PHeader(RevBuffer)^.Size; //windows.VirtualAlloc()
MoveMemory(Pointer(DWORD(RevBuffer)+2*S_INTEGER),Pointer(DWORD(RevBuffer)+S_HEADER),MemSize-S_HEADER);
ReallocMem(RevBuffer,MemSize-S_HEADER+2*S_INTEGER);
PDWORD(Pointer(DWORD(RevBuffer)+S_INTEGER))^:=AryLen; //设置动态数组长度。
RevBuffer:=Pointer(DWORD(RevBuffer)+2*S_INTEGER);
//Dec(PDWORD(RevBuffer),1);
//PDWORD(RevBuffer)^:=0; //引用计数大于0
//Inc(PDWORD(RevBuffer),2);
end
else
begin
FreeMem(RevBuffer);
RevBuffer:=nil;
end;
end;
minizhuxianchun 2019-01-09
  • 打赏
  • 举报
回复
所以说呢,大多学DEPHI的人对指针涉及不多,但DELPHI对指针的支持和C一样的,甚至我们可以开一片内存人工造一个数组
  • 打赏
  • 举报
回复
2的写法是错了, 原因是临时变量生存周期只存在于函数内部 1的写法是对的, 但是实际就相当于new, 没必要设置个临时变量

function  Myfunc1:pdata;
begin
  new(Result);
end;
BlueStorm 2019-01-08
  • 打赏
  • 举报
回复
写法2不论是对哪个版本的Delphi都是不合理的, 因为data是局部变量,它所占用的内存在函数退出时就会被释放掉,这些内存随时都有可能被本身程序或其它程序重新分配。
  • 打赏
  • 举报
回复
2是典型的错误,返回局部变量的引用或指针。
由于Delphi的函数允许返回任意类型,实际上不必返回一个指向复杂类型的指针,后者是典型的C方式,可以直接:
function Myfunc: Tdata;
begin
Result[0] := 1;
end;
doloopcn 2019-01-07
  • 打赏
  • 举报
回复
建议用1

1的写法标准,版本兼容性好

2的写法适合D7之类的版本,到了XE会DEBUG到你头爆
武稀松 2019-01-07
  • 打赏
  • 举报
回复
第二种明显是错的,把局部变量地址做返回值.离开函数,局部变量就被回收了.内存若么可读,若么随机或保持原值.
也可能被其他代码重复使用.
lyhoo163 2019-01-07
  • 打赏
  • 举报
回复
type
Tdata =array [0..3] of byte;
pdata=^Tdata; // 指向Tdata的指针 类型


type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
A:pdata;


implementation

{$R *.dfm}


function Myfunc1:pdata;
var data:Pdata;
begin
new(data);
result := data; // 返回 指针类型
end;

function Myfunc2:pdata;
var data:Tdata;
begin
result := @data; // 返回 指向data的指针
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
A:=Myfunc1;
A:=myfunc2;
end;


二者都可以,返回的都是pdata。

5,927

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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