c - 按位运算期间检测到堆栈粉碎

标签 c bitwise-operators stack-smash

我正在尝试使用按位运算符了解位(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/

相关文章:

java - 一条线上的多个分配未按预期工作

c++ - 使用位实现集合

c++ - *** 检测到堆栈粉碎 *** 使用 FEAST 返回函数时出错

C语言-具有递归功能的二叉树,打印 "node connection"

c - 按位运算和移位

libpcap 编译期间的类型冲突

c - C 中的堆栈粉碎/缓冲区溢出

c++ - 如何在 C++ 应用程序中重现 "Stack smashing detected"

c - 在 C 的 while 循环中读取整数后跳过 scanf

c - 在 CentOS 5.4 中编译 netfilter_queue 遇到困难(GCC 错误)