我有一个循环遍历存储在缓冲区中的图像,一次获取 1024 字节,然后将这一千字节作为 UDP 数据包发送出去。以下是代码的相关部分。
为什么当 curr*1024
大于 buf 时,我的第二个 if 语句
?我陷入了无限循环,直到 memcpy 最终抛出段错误才结束。我的 buf.bytesused 大约是 900,000,但它并没有循环大约 900 次,而是一直持续下去,即使 if (buf.bytesused - curr*1024 > 1024)
没有失败.bytesusedbuf.bytesused - curr*1024
给出了肯定小于 1024 的否定结果。
以防万一:当 curr 较小时,buf.bytesused - curr*1024 > 1024 满足我的预期,并且运行第二个 if block 。然而,当 curr 变大时(甚至大到 buf.bytesused - curr*1024 为负数),第二个 if block 仍在运行,而不是在 else 之后的第三个 block 。
buf.bytesused
是一个无符号的 32 位整数。
#define FRAME_START 0x0
#define FRAME_END 0xF
#define FRAME_MID 0xA
uint_32 buf.bytesused = 921600;
char frameInfo = FRAME_START;
char frameNum = i;
int curr = 0;
while (frameInfo != FRAME_END) {
if (curr == 0) {
frameInfo = FRAME_START;
memcpy(&frameInfo, &udpBuf[0], 1);
memcpy(&frameNum, &udpBuf[1], 1);
memcpy(buffers[buf.index].start + curr*1024, udpBuf + 2, 1024);
}else if (buf.bytesused - curr*1024 > 1024) {
frameInfo = FRAME_MID;
memcpy(&frameInfo, &udpBuf[0], 1);
memcpy(&frameNum, &udpBuf[1], 1);
memcpy(buffers[buf.index].start + curr*1024, udpBuf + 2, 1024);
} else {
frameInfo = FRAME_END;
memcpy(&frameInfo, &udpBuf[0], 1);
memcpy(&frameNum, &udpBuf[1], 1);
memcpy(buffers[buf.index].start + curr*1024, udpBuf + 2, (buf.bytesused % 1024));
}
if (sendto(s, udpBuf, BUFLEN, 0, &si_other, slen)==-1)
diep("sendto()");
curr++;
}
顺便说一句,有人可以告诉我我在使用 memcpy 时做错了什么吗?它不会将我的两个字符的值复制到我的缓冲区。
最佳答案
if (buf.bytesused - curr*1024 > 1024) 在 curr*1024 大于 buf.bytesused 时失败
当 buf.bytesused
为 unsigned
时可能会出现问题。
如果是负数且有符号,那么上面的比较应该失败。
要解决问题,您也可以使用简单的数学。
if (buf.bytesused > curr*1024 + 1024)
或
if (buf.bytesused > (curr + 1)*1024)
除非 curr+1
为负数,否则这些条件不会导致符号问题。
我认为这应该可以解决您的问题。
关于c - if 语句似乎永远不会失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20256839/