我试图知道位(0或1)的状态,使用逐位运算符,我得到了所需的输出,但同时我也检测到堆栈崩溃的错误。请帮帮我。
#include<stdio.h>
#include<stdlib.h>
int main()
{
char lights[2];
int n;
for(int i=0; i<2; i++)
{
printf("Enter byte %d\n",i);
scanf(" %d",&lights[i]);
}
for (int i=0; i<15; i++)
{
n=i/8;
if(n==0)
{
if (lights[n] & 128>>i)
printf("Light %d is on\n",i);
else
printf("Light %d is off\n",i);
}
if(n==1)
{
if (lights[n] & 128>>(i-8))
printf("Light %d is on\n",i);
else
printf("Light %d is off\n",i);
}
}
}
最佳答案
这里的问题是,您试图使用char
中的%d
格式读取声明为scanf
的变量(它将向给定地址写入int
):
scanf(" %d", &lights[i]); // lights is declared as char[2]
您应该在格式字符串(scanf format specifiers)中使用“非常小”大小说明符:
scanf(" %hhd", &lights[i]);
不知道这为什么会给出“stack smashing”警告,但我不熟悉您的代码分析器(但请参阅Alain Merigot的评论)。但是,试图将
int
值(可能是4个字节)写入仅为char
(1个字节)的位置将是未定义的行为。