求教:为什么总是非法指针

KLSD 2003-08-03 12:05:13
在使用socket的readbuf方法时,
我写了如下代码:
maya *you;
void *in;
tin = Socket->ReceiveBuf(in , Socket->ReceiveLength());(***)
you = (maya *)in;
usa = you->from;
cna = you->str;

执行到(***)这句后,就出现了windows socket error: the system detect an
invalid point address in attempting to use a pointer argument in a
call(10014) , on api "recv" .的错误。
其中maya是自定义的一个struct:
struct test{
AnsiString str;
AnsiString from;
};
typedef struct test maya;

--
...全文
97 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
mme 2003-08-05
  • 打赏
  • 举报
回复
用完记得 delete []in
mme 2003-08-05
  • 打赏
  • 举报
回复
靠,你也真够狠 ^_^

没有分配内存照样操作,不出错才怪.

maya you; //这样就不用自己分配内存

in = new char [3000]; //加上这一句,应该就没问题啦
tin = Socket->ReceiveBuf(in , Socket->ReceiveLength());
memcpy(&you,in,tin);
usa = you.from;
cna = you.str;

当然你想用指针也可以.反正都一样.

sprewellkobe 2003-08-05
  • 打赏
  • 举报
回复
季头分析的有理

TR@SOE 2003-08-05
  • 打赏
  • 举报
回复
还有,我觉得在struct中用String作为成员是很不安全的。应该用char* 或 char [];
jishiping 2003-08-05
  • 打赏
  • 举报
回复
you = (maya * )malloc(sizeof(2048));
try{
tin = Socket->ReceiveBuf(you , Socket->ReceiveLength());


上面你分配的内存大小固定为4个字节(注意sizeof(2048)的值为4,而不是2048),即使这儿
是2048,如果 Socket->ReceiveLength() 超过2048的话,程序还是会出现问题。应该是:
int nLen = Socket->ReceiveLength();
if (nLen <= 0) return;

you = (maya*)malloc(nLen);
tin = Socket->ReceiveBuf(you , nLen);
//......

还有,下面的代码:
j = st->IndexOfObject(Socket);
if(j == -1){
return;
}
这儿直接返回,没有释放前面分配的内存you。
KLSD 2003-08-03
  • 打赏
  • 举报
回复
maya *you;
you = (maya * )malloc(2048);
这样还是报AV in vcl50.bpl错

所有代码如下:

void __fastcall TForm1::ssClientRead(TObject *Sender,
TCustomWinSocket *Socket)
{

AnsiString cna , usa;
int tin;
int j;

//maya *you;
maya *you;
//void *in;
you = (maya * )malloc(sizeof(2048));
try{
//memset(you ,0 , sizeof(maya));
tin = Socket->ReceiveBuf(you , Socket->ReceiveLength());
//you = (maya *)in;
usa = you->from;
cna = you->str;

j = st->IndexOfObject(Socket);
if(j == -1){
return;
}



if(tin != 1)
{
if(usa == "un="){


st->Strings[j] = cna;


sendM(Format("%s has connected ." ,
OPENARRAY(TVarRec,(cna ))), "server ");
}
else
{


cna = st->Strings[j];
sendM(cna , usa);
}
}

}
__finally{
free(you);
}
}
只是(###)句不错了,但you在读完之后仍为
空值,(from = "" , str = ""),且在(***)句出现了AV in vcl50,
用you = (maya * )malloc(4096);也是一样。


tin = Socket->ReceiveBuf(you , Socket->ReceiveLength());(###)
//you = (maya *)in;
usa = you->from;
cna = you->str;(***)
qibo999 2003-08-03
  • 打赏
  • 举报
回复
你定义了指针,给它们分配了内存了吗?

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧