type
pTStruct = ^TStruct;
TStruct = record
arr: array[0..9] of char;
end;
procedure TForm1.Button7Click(Sender: TObject);
var
a: pTStruct;
arr: array[0..9] of char;
begin
new(a);
FillChar(a^,SizeOf(a^),#0);
StrCopy(a^.arr,PChar(Trim('1234567890')));
ShowMessage(Trim(a^.arr));
dispose(a);
end;为什么当显示ShowMessage(Trim(arr));是会出错,
而当用指针时就不出错呢?不明白
pTStruct = ^TStruct;
TStruct = record
arr: array[0..9] of char;
end;
procedure TForm1.Button7Click(Sender: TObject);
var
a: pTStruct;
arr: array[0..9] of char;
begin
new(a);
FillChar(a^,SizeOf(a^),#0);
StrCopy(a^.arr,PChar(Trim('1234567890')));
ShowMessage(Trim(a^.arr));
dispose(a);
end;为什么当显示ShowMessage(Trim(arr));是会出错,
而当用指针时就不出错呢?不明白
解决方案 »
- socketconnection提示out of memory,怎么办?
- 有几个问题好长时间没有解决,想请问大家。
- 有关fastreport的报表保存成WORD文档格式全乱的问题,I NEED HELP...
- 在SQLSERVER2000中,出现这样的问题:"在更新时无法重新定位!,一些行值已经改变",是咋回事?
- 关于控件Ehlib3.0安装的问题
- 这种网络故障有谁遇到过?
- 求一份DELPHI的工作
- 我用delphi6+Access2000做了一个简单系统,其中有一个表里得内容要发布到网上,请问如何编程实现?
- 关于delphi中利用IdIcmpClient空间实现ping命令
- 我怎么找不到sql语句的帮助呢?在哪里呀?(没分了,过两天补上)
- D2009下 TIdCookieManager 为什么无效?
- stack overflow
与
ShowMessage(Trim(a^.arr));
这两句里的“arr”完全是两码事,arr是局部数组,a^.arr是记录体a^里的数组元素
ShowMessage(Trim(a^.arr)); //其中的a^.arr为结构体中的一个成员,已通过StrCopy赋值
ShowMessage(Trim(arr));//其中的arr为一个局部的变量
如果没有结束符位,可能会出错。例如:
procedure TForm1.Button7Click(Sender: TObject);
var
arr: array[0..9] of char;
begin
strcopy(arr,'1234567890');
ShowMessage(Trim(arr));
end; 你们可以运行下这个例子,会报错,为什么????
建议使用下面这种方法:
var
arr: array[0..9] of char;
begin
CopyMemory(@arr[0],@'1234567890'[1],Length(arr));
ShowMessage(StrPas(@arr[0]));
end;
三、用上面的代码虽然不会出错,但因为没有指定字符串结束符的位置,所以会出现乱码。可以这样:
var
arr: array[0..9] of char;
begin
CopyMemory(@arr[0],@'123456789'#0[1],Length(arr));
ShowMessage(StrPas(@arr[0]));
end;
出错的原因是: array[0..9] of char; 这个char数组是容不下PChar('1234567890')这个C字符串的, 因为C字符串必须是以#0结尾的, 所以PChar('1234567890')是需要11个字节的存储空间。
改成 arr: array[0..10] of char; 就不会出错了。
为什么用new()分配的p^.arr可以不出错,而过程中声明的局部变量array[0..9]of char虽然同样长度,却会报错?在这里说一下:两个都很危险,仅仅是new()分配的未报错而已。为什么未报错(是不是因为“堆”、“栈”的不同导致,这需要仔细研究)暂不讨论,先让楼主看一下使用StrCopy操作的危险:
procedure TForm1.Button1Click(Sender: TObject);
var
a: pTStruct;
arr1: array[0..9] of char;
aa: TStruct;{用这种方式声明的局部变量,与arr1一样会报错。这个不演示了}
p1,p2: ^Char;
begin
new(a);
Integer(p1) := Integer(@a^.arr[9])+1;{最后一个元素地址加1}
Integer(p2) := Integer(p1)+1;{最后一个元素地址加2}
Showmessage(p1^+p2^);{看一下是什么结果。再看一下执行StrCopy后是什么结果}
StrCopy(a^.arr,PChar(Trim('1234567890ab')));{多出两个字符}
Showmessage(p1^+p2^);{看一下现在是什么结果。应该是'ab'。危险吧?!}
ShowMessage(a^.arr);
dispose(a);
end;
StrCpy does not perform any length checking. The destination buffer must have room for at least StrLen(Source)+1 characters.
begin
strcopy(arr,'1234567890');
ShowMessage(Trim(arr)); '12345670' 后边有个换行符, 要11个字节来保存
arr: array[0..10] of char;