我正在尝试使用按位运算符了解位(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);
}
}
}
最佳答案
这里的问题是您正试图在 scanf
中使用 %d
格式读取声明为 char
的变量(这将写入给定地址的 int
):
scanf(" %d", &lights[i]); // lights is declared as char[2]
您应该在格式字符串 (scanf format specifiers) 中使用“非常小”的大小说明符:
scanf(" %hhd", &lights[i]);
不确定为什么这会发出“堆栈粉碎”警告,但我不熟悉您的代码分析器(但请参阅 Alain Merigot 的评论)。但是,尝试将一个 int
值(可能是 4 个字节)写入一个只有 char
(1 个字节)的位置将是未定义的行为。
关于c - 按位运算期间检测到堆栈粉碎,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58429266/