按位操作期间检测到堆栈崩溃

问题描述 投票:0回答:2

我试图使用按位运算符来了解位(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);
        }
    }

}
c bitwise-operators stack-smash
2个回答
2
投票

这里的问题是,您正在尝试使用char中的%d格式读取声明为scanf的变量(这会将int写入给定的地址):

scanf(" %d", &lights[i]); // lights is declared as char[2]

您应该在格式字符串(scanf format specifiers)中使用'very small'大小说明符:

scanf(" %hhd", &lights[i]);

[不确定为什么会给出“堆栈粉碎”警告,但是我对您的代码分析器并不熟悉(但请参见Alain Merigot的评论)。但是,尝试将int值(可能是4个字节)写入仅一个char(1个字节)的位置将是未定义的行为。


0
投票

通过将char作为整数写入超出分配的堆栈时,发生堆栈粉碎。

在更高版本的GCC编译器中,它包含堆栈金丝雀,这是堆栈溢出的保护代码,您可以通过-fno-stack-limit禁用它,然后会看到分段错误。

解决问题的方法与@Adrian建议的相同

© www.soinside.com 2019 - 2024. All rights reserved.