iOS非常惊人(malloc_error_break)

时间:2017-03-23 04:42:51

标签: ios

首先是我的代码

#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);

频繁使用后可能会出现问题

question

这个问题让我很头疼为什么会出现“在malloc_error_break中设置一个断点来调试” 我已经添加了“malloc_error_break”断点,但它不起作用...... 谁能告诉我答案???

1 个答案:

答案 0 :(得分:0)

以这种方式使用memcpy中的指针

memcpy(tcpHeader + TCP_HEADER_PACKET_LEN,sendObj, data.length);

这意味着您希望将tcpHeaderTCP_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);

我会推荐第一个,因为它很清楚你在计算什么。在第二个中,不清楚为什么要添加一个,以及在复制非该类型的数据时使用指向一种类型的指针。