这是我的代码:
#include <stdlib.h>
#include <stdio.h>
int sendMessage(uint8_t *pui8MsgData, int messageLength, uint32_t ui32ObjID)
{
int total = 0;
int bytesleft = messageLength;
int n;
int chunkSize;
while (bytesleft)
{
chunkSize = bytesleft > sizeof(uint8_t)*8 ? sizeof(uint8_t)*8 : bytesleft;
uint8_t *buffer = (uint8_t *)malloc(sizeof(uint8_t) * chunkSize);
if(buffer == NULL)
{
printf("Memory allocation failed");
return 0;
}
memcpy(buffer, pui8MsgData, sizeof(uint8_t) * chunkSize);
n = send(buffer, chunkSize, ui32ObjID);
total += n;
bytesleft -= n;
}
return 1;
}
但由于某种原因,malloc总是返回NULL ..可能是什么错误?或者如何获取malloc返回的错误?
答案 0 :(得分:6)
这是不可能100%确定地告诉你这里有什么问题;信息太少了。
然而,malloc()
似乎毫无意义,你永远不会free()
。这是内存泄漏,这可能解释了为什么内存不足导致malloc()
返回NULL
。对我来说似乎是合理的。
只需将数据直接传递给send()
,无需分配新缓冲区并复制数据。
编辑:此外,您永远不会更新pui8MsgData
,因此您一遍又一遍地处理邮件的第一个字节。
因此,总而言之,循环应该是这样的:
while (bytesleft)
{
const chunkSize = bytesLeft > 8 ? 8 : bytesLeft;
const ssize_t n = send(ui32ObjID, pui8MsgData + total, chunkSize);
if (n < 0)
{
fprintf(stderr, "Send() failed\n");
return 0;
}
total += n;
bytesLeft -= n;
}
这可以通过删除malloc()
来解决问题。我还将参数交换为send()
,假设ui32ObjID是有效的文件描述符。
答案 1 :(得分:1)
您正在使用buffer作为send()的第一个参数。但是send()函数需要一个文件描述符,而不是一些uint8_t *所以send()可能会返回-1。这导致bytesleft的增加值,因此无限循环具有无限的内存分配,最终返回NULL。