关于字符串和字符数组的问题(50分)

  • 主题发起人 主题发起人 TheCodec
  • 开始时间 开始时间
T

TheCodec

Unregistered / Unconfirmed
GUEST, unregistred user!
function GetNumber(): PChar;
var
szOutBuffer: array[0..40] of Char;
begin
DirectIdentify;
Result := 'Get Number';
szOutBuffer[SizeOf(sNumber)] := #0
//sNumber是一个字符数组
StrLCopy(szOutBuffer, sNumber, SizeOf(sNumber));
StrLcopy(Result, szOutBuffer, SizeOf(szOutBuffer))
//我想把sNumber赋给函数返回值,所以使用了StrLCopy,但是执行到这里出现存取违例,请问是为什么?
end;
 
我在Delphi帮助中看到这样的一段话:
A common error when working with PChars is to store in a data structure, or return as a value, a local variable. When your routine ends, the PChar will disappear because it is simply a pointer to memory, and is not a reference counted copy of the string. For example:

function title(n: Integer): PChar;

var
s: string;
begin
s := Format('title - %d', [n]);
Result := PChar(s)
// DON'T DO THIS
end;

This example returns a pointer to string data that is freed when the title function returns.
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
它的意思好像是说,如果使用PChar的话,在函数结束的时候,PChar指向的数据被自动释放了?那我要返回PChar指向的数据怎么办??

 
procedure GetNumber(var ps : PChar);
begin
.
.
StrLcopy(ps, szOutBuffer, SizeOf(szOutBuffer))


end;
 
白海森:还是不行啊,我的这个是在一个DLL里面的,我用了一个测试程序来调用这个Dll,还是显示存取违例,不过好像地址变了而已.
 
不知lstrcpy(pchar,pchar)会怎么样
 
蒸发密令:我试过的,不行
 
function GetNumber(): PChar;
var
szOutBuffer: array[0..40] of Char;
begin
DirectIdentify;
Result := 'Get Number';
szOutBuffer[SizeOf(sNumber)] := #0
//sNumber是一个字符数组
StrLCopy(szOutBuffer, sNumber, SizeOf(sNumber));
// StrLcopy(Result, szOutBuffer, SizeOf(szOutBuffer))
//我想把sNumber赋给函数返回值,所以使用了StrLCopy,但是执行到这里出现存取违例,请问是为什么?
Result := szOutBuffer;//我这样的话,返回的结果为空,而szOutBuffer的确有值
end;
 
pchar只是一个指针而已,
直接用
result:=szOutBuffer;
 
有这么复杂吗???
 
谢谢大家,我犯了低级错误,在使用Result前一定要分配内存;
我这样就好了
function GetNumber(): PChar;
var
szOutBuffer: array[0..40] of Char;
begin
DirectIdentify;
Result := StrAlloc(SizeOf(szOutBuffer));
szOutBuffer[SizeOf(sNumber)] := #0
//sNumber是一个字符数组
StrLCopy(szOutBuffer, sNumber, SizeOf(sNumber));
StrLcopy(Result, szOutBuffer, SizeOf(szOutBuffer))
//我想把sNumber赋给函数返回值,所以使用了StrLCopy,但是执行到这里出现存取违例,请问是为什么?
end;
 
基本概念没理解。
在函数内声明的字符数组的作用域只在函数内,程序运行出函数时它也就不存在了,
所以你的函数应该如下声明:
function GetNumber(var p: PChar);
在调用前应该先分配空间
在函数内将szOutBuffer的内容拷贝到p即可
 
spear,不一定要用你那种方式,我这样做同样是正确的吧?谁规定一定要传指针?
 
从逻辑上讲是不需要,但用户需要在函数外释放内存,
不如自己分配,自己释放来得清晰。
 
同意spear的说法!
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
915
SUNSTONE的Delphi笔记
S
后退
顶部