Кольцевой буфер в C Программа получила сигнал SIGSEGV, Ошибка сегментации - PullRequest
0 голосов
/ 29 января 2019

Я пытаюсь присвоить определенное количество значений из кольцевого буфера массиву.

Буфер выглядит так:

typedef struct
{
     char* buffer;
     int8_t* buffer_end;
     int8_t* data_start;
     int8_t* data_end;
     int64_t count;
     int64_t size;
 } ring_buffer;

и я вынимаю данныеиспользование этой функции

uint8_t RB_pop(ring_buffer* rb)
{
    if (rb == NULL || rb->buffer == NULL)
        return false;

    int8_t data = *rb->data_start;
    rb->data_start++;
    if (rb->data_start == rb->buffer_end)
        rb->data_start = rb->buffer;
    rb->count--;

    return data;
}

Она работает, как задумано, когда я использую ее по одному, но программа падает, если я использую ее внутри цикла с отладчиком, указывающим на "int8_t data = * rb-> data_start;"

Редактировать:

Это тот случай, над которым я работаю.Цикл while не вызывает никаких проблем, он для.Без него код работает с файлом, даже если я вручную повторю цикл, повторяя строку n раз.К сожалению, я не могу ответить ни на один вопрос относительно буфера, я нуб в C, я нашел это в Интернете и не до конца понимаю, Это полный структура: https://codereview.stackexchange.com/questions/16468/circular-ringbuffer/20517

while(true){


    if(RB_pop(&test) == 255){

        if(RB_pop(&test) == 255){

            if(RB_pop(&test) == 254){



                char_count = RB_pop(&test);

                printf("Char count: ");
                printf("%d",char_count);
                printf("\n");

                printf("Text: ");

                int i;
                for(i = 0; i < char_count; i ++)
                    RB_pop(&test);

                checksum = RB_pop(&test);


                break;

            }

        }

    }


}

Редактировать 2: я начал работать над другими частями программы и испытал то же поведение, также заметил это сообщение от отладчика: «Программа получила сигнал SIGSEGV, Ошибка сегментации.»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...