Обрыв стека обнаружен во время битовой операции - PullRequest
0 голосов
/ 17 октября 2019

Я пытаюсь узнать состояние битов (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);
        }
    }

}

Ответы [ 2 ]

3 голосов
/ 17 октября 2019

Проблема здесь в том, что вы пытаетесь прочитать переменную, объявленную как char, используя формат %d в scanf (который запишет int по указанному адресу):

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

В строке формата следует использовать спецификатор размера «очень маленький» ( спецификаторы формата scanf ):

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

Не уверен, почему это может привести к предупреждению «разрушения стека», но я не знаком с вашим анализатором кода, хотя (но см. комментарий Alain Merigot ). Однако попытка записать значение int (вероятно, 4 байта) в местоположение, которое составляет всего char (1 байт), будет неопределенным поведением.

0 голосов
/ 18 октября 2019

разрушение стека происходит, когда вы записываете за пределы выделенного стека, записывая char как целое число.

В более поздней версии компилятора GCC он включает канареки стека, которые являются кодом защиты от переполнения стека. Вы можете отключитьэтот -fno-stack-limit, тогда вы увидите ошибку сегментации.

Решение проблемы такое же, как предложено @ Adrian

...