var
tmp : array of pchar;
i : byte;
begin
setlength(tmp,4);
for i := 0 to 3 do
begin
tmp[i] := pchar(IntToStr(i));
memo1.lines.Add(tmp[i]^);
end;
form1.Memo1.Lines.Add('-----');
for i := low(tmp) to high(tmp) do
begin
form1.Memo1.Lines.Add(tmp[i]^);
end;输出结果
0
1
2
3
-----
3
3
3
3
不是很明白,第一次为什么正确,后面一次为什么会错误?
tmp : array of pchar;
i : byte;
begin
setlength(tmp,4);
for i := 0 to 3 do
begin
tmp[i] := pchar(IntToStr(i));
memo1.lines.Add(tmp[i]^);
end;
form1.Memo1.Lines.Add('-----');
for i := low(tmp) to high(tmp) do
begin
form1.Memo1.Lines.Add(tmp[i]^);
end;输出结果
0
1
2
3
-----
3
3
3
3
不是很明白,第一次为什么正确,后面一次为什么会错误?
解决方案 »
- 写邮件时可以编辑正文内容的有那些控件?
- 有关ShellExecute打开PDF文件的问题.
- Delphi7自带打包程序打包出错
- 大侠们,我的delphi编译怎麽老出如下提示啊,急!!请赐教
- 基础问题,MDI窗体中主窗体如何访问当前子窗体的控件
- 如何用topendialog打开db数据库
- 关于在query中查找重号的问题?急!急!急!急!急!请各位大侠帮助
- 如何使stringGrid中的某一行或列中的内容居中显示?
- 如何把SQL数据库表里面的一个字段所有记录存到本机的一个文本文件里?
- 哪里有DELPHI关于调用OFFICE的详细资料,好像和VC中调用稍有不同
- 求救各位大侠:SMT生产车间调度问题??
- 有关TChart上值的显示
//编译器没有这样智能
//这样的内存空间需要自己处理
//不是一个简单的强制转换就搞定的procedure TForm1.Button1Click(Sender: TObject);
var
tmp: array of PChar;
i: Byte;
s: string;
begin
SetLength(tmp, 4);
for i := 0 to 3 do
begin
s := IntToStr(I);
GetMem(tmp[i], Length(s) + 1);
Move(s[1], tmp[i]^, Length(s) + 1);
Memo1.Lines.Add(tmp[i]);
end;
Memo1.Lines.Add('-----');
for i := low(tmp) to high(tmp) do
begin
Memo1.Lines.Add(tmp[i]);
FreeMem(tmp[i], StrLen(tmp[i]) + 1);
end;
end;
setlength(tmp,4);这是主要的问题,TMP[N]本来就需要自已申请间或指向已有空间!
setlength(tmp,4);这只是对TMP数组指定了空间,而同时TMP[0..3]每一个元素确只是一个指针而已!
PChar只是指针,要分配内存才行:var
tmp : array of PChar;
i : byte;
begin
SetLength(tmp,4);
for i := 0 to 3 do
begin
//tmp[i] := pchar(IntToStr(i));
GetMem(tmp[i],Length(IntToStr(i))+1);
tmp[i] := StrCopy(tmp[i],PChar(IntToStr(i)));
memo1.lines.Add(tmp[i]^);
end;
form1.Memo1.Lines.Add('-----');
for i := low(tmp) to high(tmp) do
begin
form1.Memo1.Lines.Add(tmp[i]);
end;
“
当使用PChar类型的变量时,经常会出现指针错误。由于Pchar是一个指向字符串的指针,因此必须用StrAlloc(),GetMem(),StrNew(),GlobalAlloc()或virtualAlloc()来为PChar分配内存,同时还要用StrDispose(),FreeMem(),GlobalFree()或VirtualFree()来释放内存. 提示: 你最好尽可能地使用String而不是PChar,这样可以避免潜在的缺陷.如果需要的话,可以把String强制转换为PChar.由于String是自动分配内存和释放内存的,根本没必要管内存的分配问题.
”
pchar只是一个指向#0结束字符的指针。
SetLength(tmp,0); ?
或者
FillChar(tmp, SizeOf(tmp), 0);
或者
for i := Low(tmp) to High(tmp) do
FreeMem(tmp[i]);
还是别的组合?
var
tmp: array of pchar;
i : byte;
begin
setlength(tmp,4);
for i := 0 to 3 do
begin
GetMem(tmp[I], 100);
StrCopy(tmp[I], pchar(IntToStr(i)));
memo1.lines.Add(tmp[i]);
end;
form1.Memo1.Lines.Add( '----- '); for i := low(tmp) to high(tmp) do
begin
form1.Memo1.Lines.Add(tmp[i]);
end;end;要不你把 tmp : array of pchar; 改成 tmp : array of string;
就可以了
返回一个临时字符串的首字符地址
至于这个临时字符串的空间什么时候被重用、回收,都无法预料了