分配已释放的内存时出现C段错误

时间:2013-05-17 18:10:48

标签: c arrays

我正在开发一个使用循环缓冲区来存储股票报价的程序。缓冲区必须能够扩展和缩小,具体取决于每次更新缓冲区时是否满足某些条件。但是,我有一个问题,我可以扩展缓冲区一次,但在那之后如果我尝试再次扩展它我得到段错误。在释放旧缓冲区正在使用的内存后,我正在使用新缓冲区并将其分配给旧缓冲区。我的代码如下。

cbuf* cbuf_init(){

    cbuf *buffer = malloc(sizeof(cbuf) + 9 * sizeof(quote));
    buffer->currSize = 0;
    buffer->maxSize = startSize;
    buffer->start = 0;
    buffer->end = 0;
    buffer->freeSlots = startSize;
    return buffer;
}


void cbuf_update(cbuf *cb_ptr, unsigned int time, double rate){
    int threeFourths;    
    threeFourths = (3 * cb_ptr->maxSize)/4;


    if(cb_ptr->freeSlots == 0){
        printf("\n\nEXPANDING CIRCULAR BUFFER!\n\n");

        int newSize;
        newSize = (cb_ptr->maxSize * 2) - 1;
        printf("Newsize: %d\n", newSize);
        cbuf *newBuffer = malloc(sizeof(cbuf) + newSize * sizeof(quote));
        printf("pastthe malloc\n");
        newBuffer->maxSize = cb_ptr->maxSize * 2;
        newBuffer->start = cb_ptr->start;
        newBuffer->end = cb_ptr->end;
        newBuffer->freeSlots = newBuffer->maxSize - cb_ptr->maxSize;

        int x;
        int counter;
        counter = 0;

        for(x = cb_ptr->end; x < cb_ptr->maxSize; x ++){
            newBuffer->quoteBuffer[counter].time = cb_ptr->quoteBuffer[x].time;
            newBuffer->quoteBuffer[counter].rate = cb_ptr->quoteBuffer[x].rate;
            counter ++;
        }
        int y;
        for(y = 0; y < cb_ptr->start; y ++){
            newBuffer->quoteBuffer[counter].time = cb_ptr->quoteBuffer[y].time;
            newBuffer->quoteBuffer[counter].rate = cb_ptr->quoteBuffer[y].rate;
            counter++;
        }
        newBuffer->start = cb_ptr->maxSize;
        newBuffer->end = 0;
        printf("newBuffer start: %d\n", newBuffer->start);
        free(cb_ptr);
        *cb_ptr = *newBuffer;


    }   



}

我的主要是:

int main(){

    cbuf *cb1 ;
    cb1 = cbuf_init() ;
    cbuf_update(cb1, 60, 1.291) ;
    cbuf_update(cb1, 63, 1.287) ;
    cbuf_update(cb1, 63, 1.231) ;
    cbuf_update(cb1, 69, 1.229) ;
    cbuf_update(cb1, 72, 1.247) ;
    cbuf_update(cb1,361,1.291);
    cbuf_update(cb1, 411, 1.291) ;
    cbuf_update(cb1, 412, 1.281) ;
    cbuf_update(cb1, 413, 1.292) ;
    cbuf_update(cb1, 414, 1.284) ;
    cbuf_update(cb1, 414, 1.290) ;
    cbuf_update(cb1, 511, 1.241) ;
    cbuf_update(cb1, 512, 1.251) ;
    cbuf_update(cb1, 513, 1.232) ;
    cbuf_update(cb1, 514, 1.202) ;
    cbuf_update(cb1, 517, 1.119) ;
    cbuf_update(cb1, 551, 1.080) ;
    cbuf_update(cb1, 552, 1.081) ;
    cbuf_update(cb1, 553, 1.079) ;
    cbuf_update(cb1, 554, 1.088) ;
    cbuf_update(cb1, 561, 1.072) ;
    cbuf_update(cb1, 562, 1.113) ;
    cbuf_update(cb1, 563, 1.091) ;
    cbuf_update(cb1, 564, 1.092) ;
    cbuf_update(cb1, 571, 1.089) ;
    cbuf_update(cb1, 572, 1.073) ;
    cbuf_update(cb1, 573, 1.061) ;
    cbuf_update(cb1, 574, 1.111) ;
    cbuf_update(cb1, 581, 1.119) ;
    cbuf_update(cb1, 582, 1.123) ;
    cbuf_update(cb1, 583, 1.151) ;
    cbuf_update(cb1, 584, 1.153) ;  
    cbuf_dump(cb1);
    return 0;

}

cbuf_dump只是打印出与缓冲区有关的信息。使用此代码时,我得到以下输出:

EXPANDING CIRCULAR BUFFER!

Newsize: 19
pastthe malloc
newBuffer start: 10


EXPANDING CIRCULAR BUFFER!

Newsize: 39
Segmentation fault (core dumped)

正如您所看到的,我插入了print语句,以便在运行时我可以看到代码在进行segfaulted之前的位置。它能够第一次扩展,但是当它试图为新的“newBuffer”第二次分配内存时,会出现段错误。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

这一行:

*cb_ptr = *newBuffer;

显然做了一些你不想要的事情。你可能意味着:

cb_ptr = newBuffer;

如果您的cb_ptr参数为in/out,则应将其用作:

void cbuf_update(cbuf **cb_ptr, unsigned int time, double rate)
...
if((*cb_ptr)->freeSlots == 0){
...
    *cb_ptr = newBuffer;
...

主要是:

cbuf_update(&cb1, 60, 1.291) ;