我正在尝试从环形缓冲区向数组分配给定数量的值。
缓冲区看起来像这样:
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,分段错误。”