首先是我的代码
#pragma pack (4)
typedef struct _Login{
char user[32];
char pwd[32];
int userID;
}Login,*PLogin;
const unsigned long MSG_TAG_HEADER_YXHY = 0x59485859;
#pragma pack (2)
typedef struct tagTcpPacketHeader
{
int ulHtag;
char ucVersion;
char ucCmd;
int ulUserId;
short usPacketNum;
int ulDataLen;
}TcpPacketHeader,*LPTcpPacketHeader;
#pragma pack ()
const unsigned int TCP_HEADER_PACKET_LEN = sizeof(TcpPacketHeader);
- (NSData*)sendDataFileWithUserId:(const int)nUserId nCmd:(const int)nCmd pData:(NSData*)data{
NSData* sendData;
void* sendObj = malloc(data.length);
[data getBytes:sendObj length:data.length];
static int nPacketNum = 0;
int nLen = (int)data.length + TCP_HEADER_PACKET_LEN;
char *pTmpBuf = malloc(nLen);
LPTcpPacketHeader tcpHeader = (LPTcpPacketHeader)pTmpBuf;
tcpHeader->ulHtag = MSG_TAG_HEADER_YXHY;
tcpHeader->ucVersion = 1;
tcpHeader->ucCmd = nCmd;
tcpHeader->ulUserId = nUserId;
tcpHeader->usPacketNum = nPacketNum;
tcpHeader->ulDataLen = nLen;
memcpy(tcpHeader + TCP_HEADER_PACKET_LEN,sendObj, data.length);
sendData = [NSData dataWithBytes:pTmpBuf length:nLen];
nPacketNum++;
free(pTmpBuf);
free(sendObj);
return sendData;
}
- (NSData*)get_File_Login:(NSString*)userID{
int length = sizeof(Login);
Login log_in = {"123","456",userID.intValue};
NSData* login_data = [NSData dataWithBytes:&log_in length:length];
NSData* ret = [self sendDataFileWithUserId:log_in.userID nCmd:5 pData:login_data];
return ret;
}
使用
NSData* ms = [self get_File_Login:@"123"];
NSLog(@"%@",ms);
频繁使用后可能会出现问题
这个问题让我很头疼为什么会出现“在malloc_error_break中设置一个断点来调试” 我已经添加了“malloc_error_break”断点,但它不起作用...... 谁能告诉我答案???
答案 0 :(得分:0)
以这种方式使用memcpy中的指针
memcpy(tcpHeader + TCP_HEADER_PACKET_LEN,sendObj, data.length);
这意味着您希望将tcpHeader
加TCP_HEADER_PACKET_LEN
指向的内存位置复制到指针所指向的数据大小。它与执行&tcpHeader[TCP_HEADER_PACKET_LEN]
相同。
假设你想要在标题之后写一个位置,有两种方法可以解决它:
1)使用大小为1的指针,表示char*
。在您的代码中,您有一个指针pTmpBuf
就是这样,只需将代码更改为:
memcpy(pTmpBuf + TCP_HEADER_PACKET_LEN, sendObj, data.length);
2)使用大小1进行此计算。由于它指向的数据大小与TCP_HEADER_PACKET_LEN
相同,因此将其乘以1会得到正确的位置:
memcpy(tcpHeader + 1, sendObj, data.length);
我会推荐第一个,因为它很清楚你在计算什么。在第二个中,不清楚为什么要添加一个,以及在复制非该类型的数据时使用指向一种类型的指针。