C程序中的环形缓冲区收到信号SIGSEGV,分段错误

时间:2019-01-29 17:27:35

标签: c

我正在尝试从环形缓冲区向数组分配给定数量的值。

缓冲区看起来像这样:

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语言的菜鸟,我在网上找到了此书,但并没有完全理解它,这是完整的structere: 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,分段错误。”

0 个答案:

没有答案