c - if 语句似乎永远不会失败

标签 c loops boolean-logic

我有一个循环遍历存储在缓冲区中的图像,一次获取 1024 字节,然后将这一千字节作为 UDP 数据包发送出去。以下是代码的相关部分。

为什么当 curr*1024 大于 buf 时,我的第二个 if 语句 if (buf.bytesused - curr*1024 > 1024) 没有失败.bytesused?我陷入了无限循环,直到 memcpy 最终抛出段错误才结束。我的 buf.bytesused 大约是 900,000,但它并没有循环大约 900 次,而是一直持续下去,即使 buf.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.bytesusedunsigned 时可能会出现问题。

如果是负数且有符号,那么上面的比较应该失败。

要解决问题,您也可以使用简单的数学。

if (buf.bytesused > curr*1024 + 1024)

if (buf.bytesused > (curr + 1)*1024)

除非 curr+1 为负数,否则这些条件不会导致符号问题。

我认为这应该可以解决您的问题。

关于c - if 语句似乎永远不会失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20256839/

相关文章:

c - 写入带有偏移量的文件

c - 尽管返回类型定义不同,函数仍返回 Int

c - C中没有数组的矩阵

MySQL CURSOR 循环在存储过程中添加额外的传递

javascript - 永远循环每个

javascript - 如何编译和评估对象上指定的逻辑运算符和操作数?

c - 无法在文本文件中正确写入数据

r - 如何简化这个程序?

optimization - 在评估数据绑定(bind)时, knockout 是否针对逻辑运算符进行优化?

javascript - 在 javascript 正则表达式中验证带括号的 boolean 表达式