明天就放假.. 散分. 同时来计论一个问题. 问题的最佳回答者再加开一个 200 分贴

cmain83 2003-09-29 11:16:40
如何在 Delphi 中使用双指针?
相当于 C 中的 char ** St;

代码:

Type
P_usePChar = ^PChar;


procedure TForm1.FormCreate(Sender: TObject);
var
m_outputBuffers: P_usePChar;
i: Integer;
const
N_BUFFERS = 10;
StringLeng = 255;
begin
m_outputBuffers := P_usePChar(GlobalAllocPtr(GMEM_MOVEABLE or GMEM_SHARE,
SizeOf(PChar) * N_BUFFERS));

for i := 0 to N_BUFFERS - 1 do
begin
m_outputBuffers^ := PChar(GlobalAllocPtr(GMEM_MOVEABLE or GMEM_SHARE,
SizeOf(Char) * StringLeng));
StrCopy(m_outputBuffers^, PChar(IntToStr(i)));
m_outputBuffers^ := m_outputBuffers^ + 1;
end;

{
此处应加上什么语句才能使
m_outputBuffers^ 返回开始处??
}

for i := 0 to N_BUFFERS - 1 do
Self.Memo1.Lines.Add(m_outputBuffers^ + ':' + IntToStr(DWORD(m_outputBuffers^)));

{
此处应加上什么语句才能使
m_outputBuffers^ 返回开始处??
}

for i := 0 to N_BUFFERS - 1 do
begin
GloBalFreePtr(m_outputBuffers^); //释放产生错误: 无效指针
m_outputBuffers^ := m_outputBuffers^ + 1;
end;
GloBalFreePtr(m_outputBuffers); //释放内存
end;
...全文
77 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
LSF1982 2003-09-29
  • 打赏
  • 举报
回复
混点分..
snowfog 2003-09-29
  • 打赏
  • 举报
回复
关注
cmain83 2003-09-29
  • 打赏
  • 举报
回复
这样做只是为熟悉指针操作.

其实, 这里用 动态数组很容易实现. 并且占用的内存一样..
upingking 2003-09-29
  • 打赏
  • 举报
回复
学习
zhoutian618 2003-09-29
  • 打赏
  • 举报
回复
{
此处应加上什么语句才能使
m_outputBuffers^ 返回开始处??
m_outputBuffers^ := m_outputBuffers^ - N_BUFFERS;///////?????????
}

我很少这样去动态申请内存。
我一般用TLIST和结构或类居多。
rwdx 2003-09-29
  • 打赏
  • 举报
回复
up
cmain83 2003-09-29
  • 打赏
  • 举报
回复
ronaldli(木的)
也去顶一下吧..

cmain83 2003-09-29
  • 打赏
  • 举报
回复
还请

kylincn(笨笨)


http://expert.csdn.net/Expert/topic/2313/2313878.xml?temp=.5922815
顶一下..
cmain83 2003-09-29
  • 打赏
  • 举报
回复
笨,,,

这也想不到.


结贴啦...
kylincn 2003-09-29
  • 打赏
  • 举报
回复
还抱错?我这没有啊。
tw_cshn 2003-09-29
  • 打赏
  • 举报
回复
最后在把指针返回就不出错了

DEc(m_outputBuffers, N_BUFFERS);
for i := 0 to N_BUFFERS - 1 do
begin
GloBalFreePtr(m_outputBuffers^); //释放产生错误: 无效指针
//m_outputBuffers^:=nil;
INC(m_outputBuffers);
//^ := m_outputBuffers^ + 1;
end;
DEc(m_outputBuffers, N_BUFFERS);
GloBalFreePtr(m_outputBuffers);
cmain83 2003-09-29
  • 打赏
  • 举报
回复
wush007(防守反击) 你有种
阿亮 2003-09-29
  • 打赏
  • 举报
回复
一群猪
crossbow 2003-09-29
  • 打赏
  • 举报
回复
看看
sheepcyk 2003-09-29
  • 打赏
  • 举报
回复
先up,问题在看看
cmain83 2003-09-29
  • 打赏
  • 举报
回复
up

快呀
甜而不腻 2003-09-29
  • 打赏
  • 举报
回复
up
cmain83 2003-09-29
  • 打赏
  • 举报
回复
不错..
答案正确..

不过.
还有一点:
一到释放就会弹出一个内存窗口..

除非把

GloBalFreePtr(m_outputBuffers);
去掉就不会出错..

WHY?
是不是在上边的循环中已经释放了??
dickeybird888 2003-09-29
  • 打赏
  • 举报
回复
学习
kylincn 2003-09-29
  • 打赏
  • 举报
回复
参考ronaldli(木的) 改了一下,结果正确!

var
m_outputBuffers: P_usePChar;
i: Integer;
const
N_BUFFERS = 10;
StringLeng = 255;
begin
m_outputBuffers := P_usePChar(GlobalAllocPtr(GMEM_MOVEABLE or GMEM_SHARE,
SizeOf(PChar) * N_BUFFERS));

for i := 0 to N_BUFFERS - 1 do
begin
m_outputBuffers^ := PChar(GlobalAllocPtr(GMEM_MOVEABLE or GMEM_SHARE,
SizeOf(Char) * StringLeng));
StrCopy(m_outputBuffers^, PChar(IntToStr(i)));
//m_outputBuffers^ := m_outputBuffers^ + 1;
Inc(m_outputBuffers);
end;
//返回 m_outputBuffers^指向的第一个字符
//Here :
DEc(m_outputBuffers ,N_BUFFERS);
// m_outputBuffers^ := @m_outputBuffers^;
// or m_outputBuffers^指向的第一个PChar
//m_outputBuffers^ := @m_outputBuffers;

{
此处应加上什么语句才能使
m_outputBuffers^ 返回开始处??
}
//返回十个字符串
for i := 0 to N_BUFFERS - 1 do
BEGIN
Self.Memo1.Lines.Add(m_outputBuffers^ + ':' + String(m_outputBuffers^));
INC(m_outputBuffers);
END;

//和上面一样
{
此处应加上什么语句才能使
m_outputBuffers^ 返回开始处??
}
DEc(m_outputBuffers, N_BUFFERS);
for i := 0 to N_BUFFERS - 1 do
begin
GloBalFreePtr(m_outputBuffers^); //释放产生错误: 无效指针
INC(m_outputBuffers);
//^ := m_outputBuffers^ + 1;
end;
GloBalFreePtr(m_outputBuffers); //释放内存
加载更多回复(15)

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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