当接收传入的消息时,当我的数据包结构中有一个固定大小的数组时,我会收到正确的结果,如下所示
typedef struct inPacket{
int cmd;
int seqNo;
int numbers[100];
} inPacket;
然后我像这样调用recv
char buf[1024];
recv(m_socket, buf, sizeof(buf));
并将 char 数组转换为数据包类型
inPacket* p = (inPacket*)buf;
这工作正常,在转换后我在“数字”字段中有一个完整的整数数组。当传入我想要存储数字的地址时,我无法想象为什么下面的代码不起作用
void func(int* out)
{
inPacket inpacket;
inPacket.numbers = out;
recv(m_socket, (char*)&inpacket, sizeof(inPacket));
}
调用 recv 后,“numbers”数组是一个错误的指针。
传入的数组由调用函数分配
int numbers[10];
func(numbers);
最佳答案
recv 的作用是,它将数据从内部缓冲区复制到您提供的缓冲区中。所以它会覆盖你的结构的内容。您还可以将数组成员更改为其他指针,这是一个禁忌。不仅如此,您尝试将其设置为比现有数组更小的数组,这可能导致recv
可能覆盖新数组之外的内存。
你需要做这样的事情:
void func(int* out, int maxnum)
{
inPacket inpacket;
recv(m_socket, (char*)&inpacket, sizeof(inPacket));
memcpy(out, inpacket.numbers, sizeof(int) * maxnum);
}
然后你像这样调用该函数:
int numbers[10];
func(numbers, 10);
编辑:如果需要动态数组,则必须修改对 recv
的调用以及结构:
typedef struct inPacket{
int cmd;
int seqNo;
int numbers[0];
} inPacket;
void func(int* out, int maxnum)
{
size_t packetSize = sizeof(inPacket) + sizeof(int) * maxnum;
inPacket *inpacket = malloc(packetSize);
recv(m_socket, inpacket, packetSize);
memcpy(out, inpacket->numbers, sizeof(int) * maxnum);
free(inpacket);
}
关于c - 带有指针成员的recv数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9393548/