我试图知道位(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个字节)的位置将是未定义的行为。

10-07 17:11