【问题标题】:Segmentation Fault when using Bitwise Operators使用位运算符时出现分段错误
【发布时间】:2019-06-09 00:07:45
【问题描述】:

我目前正在处理 C 中的一个项目,该项目将接收两个 8 位二进制数并将它们转换为十进制值。我对 C 中的按位运算符以及它们如何处理数字有很好的理解,我的问题是围绕语法展开的。

ATM我的程序很简单:

int main() {
  char *inp1;
  char *inp2;
  unsigned long binNum1;
  unsigned long binNum2;

  printf("Enter the first binary number: "); 
  scanf("%s", inp1); 
  printf("Enter the second binary number: "); 
  scanf("%s", inp2); 

  binNum1 = strtoul(inp1, NULL, 2);
  binNum2 = strtoul(inp1, NULL, 2);

  unsigned long orVal = binNum1 | binNum2;
  unsigned long andVal = binNum1 & binNum2;
  unsigned long exclVal = binNum1 ^ binNum2;

  printf("Your or value is: %lu", orVal);
  printf("Your and value is: %lu", andVal);
  printf("Your exclusive value is: %lu", exclVal);

  return 0;
}

本质上,我只想得到每个二进制数的两个十进制值的 ORing、ANDing 和 EXCLing 的值。但是,当我运行它时出现分段错误。我很确定这是由于语法造成的,但我在网上找不到很多此类问题。

【问题讨论】:

  • 换句话说,inp1inp2 在您尝试使用它们之前指向哪些有效内存?也许char inp1[65]; (64+1 字节的存储空间)?
  • binNum2 = strtoul(inp1, NULL, 2);,大概你希望这实际上是binNum2 = strtoul(inp2, NULL, 2); ..?
  • @David C. Rankin 你和另一个回答关于分配内存的人是正确的。我也感谢您昨天对我以前的一些帖子的回答!
  • 很高兴它有帮助。我们将把你变成一个程序员呢。去重新审视我的答案并查看验证。对于简短的示例,它们似乎是不必要的工作,但尽早养成良好习惯可以避免以后的未定义行为......了解如何验证代码中的每个关键步骤是编程的基础。

标签: c binary bit-manipulation decimal


【解决方案1】:

用这些线

char *inp1;
char *inp2;
...
scanf("%s", inp1);
scanf("%s", inp2);

您尚未将任何内存分配给inp1inp2。指针未初始化,这可能是段错误的原因。

为了简化,你可以这样做:

char inp1[100];
printf("Enter the first binary number: "); 
if(scanf("%99s", inp1) != 1) {
    return 1;
}

inp2 也是如此。

【讨论】:

  • 你是对的!手动声明内存后,它工作得很好: char *bitStr = (char *)malloc(9*sizeof(char));
  • 这将只允许您输入 8 位,但您正在处理 unsigned long 这些天通常为 32 位的值。在我的示例中,限制scanf 的输入长度总是值得的。
猜你喜欢
  • 2018-09-10
  • 1970-01-01
  • 2017-12-26
  • 2020-07-14
  • 2020-11-27
  • 2015-04-29
  • 1970-01-01
  • 2017-02-22
  • 1970-01-01
相关资源
最近更新 更多