pchar怎么用c语言定义,Q:关于PChar的用法(200分)

博客讨论了在使用Delphi编程时,GetPrivateProfileString函数的参数处理问题,特别是关于pChar类型的内存分配和字符串处理。文章提到了三种解决方案:动态分配内存、使用字符数组或直接使用字符串,并推荐了使用动态分配内存的方法,因为它既安全又方便。还提醒了在使用字符串时可能遇到的HugeString选项问题。
摘要由CSDN通过智能技术生成

天啊!!这个问题居然还没有收场???我本来这些天不打算在这儿回答问

题,因为我在做我的MainPage,更糟糕的是,我的系统受到网络Hacker攻击,

Format C:了。忙于整理系统的时候,还是被这200分给吸引了,毕竟,有银

子可拿是无比爽快的事啊!

======================================

1. 如果你的确可以用 acAddress: array[0..20] of Char;来传参数,那

么就可以肯定,你没有为pChar分配内存。

2. GetPrivateProfileString()的第四个参数是lpReturnedString,用于

返回结果串。如果你没有给这个LPTSTR(Delphi中用pChar)分配内存,则返

回为空,如果分配内存不足,将导致结果串不全。

3. 问题是为什么呢?pChar的定义只是一个Pointer!!这意味着,除一个地

址外,pChar本身不用于存放任何东西,也不存放字符串。要不你用sizeof(pChar)

看看就明白了。那可只有4个byte呀!!

4. 那么,pChar的字符串在那儿呢?它事实上被存放在以pChar指向的一个

不定长内存块中。以#0为这个串的结束标志。如果没有特殊指定,Windows

只在找到#0时就认为串结束,而不会如得到一个你所期望的字符串。

5. 我们致少有以下三种解决方法:

(1)在使用pAddress前分配内存,使用后释放内存。

StrSize := 20;

GetMem(pAddress,StrSize);

... //GetPrivateProfileString()调用

FreeMem(pAddress,StrSize);

(2)使用字符数组

const StrSize = 20;

var pAddress : pChar;

chrArr : Array [0..StrSize] of Char;

begin

...

pAddress := @chrArr;

... //GetPrivateProfileString()调用

end;

//这种用法中,Delphi会自动释放掉chrArr所用内存

(3) 直接使用字符串

在Delphi 3及以上版本中,支持Huge String,你可以直接将String

用成pChar(D2是否可以,我没有试过)。但是,你也要先给String指定一个长度。如下:

var sAddress : String;

StrSize : Integer;

begin

StrSize := 20;

SetLength(sAddress,StrSize);

GetPrivateProfileString('Host', 'Address', '127.0.0.1',

pChar(sAddress), StrSize, 'tPing.ini');

end;

6. 关于建议:

在上述三种方法中,第一种最安全,第三种是最方便的(因为你可以有一个

动态的buffer,并且,可以象String一样方便的用它),我推荐使用第三种方法。

WritePrivateProfileString()中的使用同上。但如果你采用第三种方法,

则只需要将字符串写到Host串中,用pChar(Host)作为入口参数就成了。不需要

再用SetLength()来指定串长。

使用第三种方法如果编译时提示字符串类型转换错误,则是因为你没有将"Huge

String"编译选项打开,可使用{$H+}编译符指定,或设置Project的Option。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值