求如下三个C语言函数,自己写的函数几次调用返回的值都有点问题,晕了!int FnTest1(char *A,char *B)
int FnTest2(char *A,char **B)
int FnTest3(char *A,char *&B)
A:传入参数,字符串长度不固定(假设是字符串"ABCDEF");B:将A的值加上“GH”返回(需要动态分配和释放内存);函数返回值是B的长度假设将以上三个函数封装成动态库XYZ.dll,则Delphi调用的形式,请给列出,并将B的返回值传到string类型 S;
实现和调用共3对,每对60分,共180分。谢谢!
int FnTest2(char *A,char **B)
int FnTest3(char *A,char *&B)
A:传入参数,字符串长度不固定(假设是字符串"ABCDEF");B:将A的值加上“GH”返回(需要动态分配和释放内存);函数返回值是B的长度假设将以上三个函数封装成动态库XYZ.dll,则Delphi调用的形式,请给列出,并将B的返回值传到string类型 S;
实现和调用共3对,每对60分,共180分。谢谢!
难点在"需要动态分配和释放内存"
在C程序int FnTest1(char *A,char *B) 中:
申请内存没有什么问题,什么时候适放是个大问题
我们在应用中,一般的用法是,在调用DLL前,先申请好内存(B)再调用DLL
另一方法,自己写内存管理,那就要在调用int FnTest1(char *A,char *B)之后,再调用一个释放内存的函数
除此以外,我想不出有什么好方法,在dll中申请内存,并能在调用后自动释放
一般这类的函数我都会声明成
function FnTest1(const A:PChar;B:PChar):Integer;
在调用的时候分配A和B的内存,B一般给个足够使用的大小,一般调用完毕就进行释放.
C_ADD_STR = 'GH';type
PPChar = ^PChar;{int FnTest1(char *A,char *B)}
function FnTest1(const A: PChar; var B: PChar): Integer;
begin
Result:= StrLen(A) + StrLen(C_ADD_STR) + 1; GetMem(B, Result); FillChar(B^, Result, #0); StrCopy(B, A);
StrCat(B, C_ADD_STR);
end;{int FnTest2(char *A,char **B) }
function FnTest2(const A: PChar; var B: PPChar): Integer;
begin
Result:= StrLen(A) + StrLen(C_ADD_STR) + 1; GetMem(PChar(B^), Result); FillChar(PChar(B^)^, Result, #0); StrCopy(PChar(B^), A);
StrCat(PChar(B^), C_ADD_STR);
end;{int FnTest3(char *A,char *&B) }
function FnTest3(const A: PChar; B: PPChar): Integer;
begin
Result:= StrLen(A) + StrLen(C_ADD_STR) + 1; GetMem(PChar(B^), Result); FillChar(PChar(B^)^, Result, #0); StrCopy(PChar(B^), A);
StrCat(PChar(B^), C_ADD_STR);
end;procedure TForm1.Button1Click(Sender: TObject);
var
A: String;
B: PChar; C: PPChar;
begin
B:= nil;
A:= 'ABCDEF';
FnTest1(PChar(A), B);
ShowMessage(B); A:= 'ABCDEF';
B:= nil;
C:= @B;
FnTest2(PChar(A), C);
ShowMessage(B); A:= 'ABCDEF';
B:= nil;
C:= @B;
FnTest3(PChar(A), C);
ShowMessage(B);
end;
如:
#include <stdio.h>
#include <string.h>
int Fntest(char *A, char **B)
{
strcpy(*B,A);
strcat(*B,"GH");
return strlen(*B);
}int main()
{
char *str="ABCDEF";
char *buf= (char *) malloc(2+sizeof(str)+1);
printf("%d\n", Fntest(str,&buf));
free(buf);
return 0;
}