0

我正在做家庭作业,我需要基本上创建一个字符缓冲区。我需要创建的功能之一称为“b_reset”。它的目的是重新初始化给定的缓冲区,使其指向 char 缓冲区中的第一个位置。这是必要的,因为稍后,当一个新的字符被添加到缓冲区时,它需要被添加到缓冲区的第一个位置。

这是我到目前为止的代码:

结构:

typedef struct BufferDescriptor {
    char * ca_head ;
    int capacity ;
    char inc_factor;
    int addc_offset ;
    int mark_offset ;
    char r_flag;
    char mode;
} Buffer ;

编码:

int b_reset ( Buffer *pB )
{
    Buffer *temp = NULL;
    int i = 0;
    int j = 1;

    if (pB == NULL)
    {
    return R_FAIL_1;
    }
    else
    {
        temp = (Buffer*)malloc(sizeof(Buffer*));
        if (temp == NULL)
        {
            return R_FAIL_1;
        }
        temp->ca_head = (char*)malloc(pB->capacity);
        if (!temp->ca_head)
        {
            temp = NULL;
            return R_FAIL_1;
        }

        for(i = 0;i < ca_getsize(pB);++i)
        {
            temp->ca_head[j] = pB->ca_head[i];
            j++; 
        }

        pB->ca_head = temp->ca_head;

        //free(temp->ca_head);
        //free(temp);

        return 0;
    }
}

我在这段代码中的目标是创建一个临时缓冲区,它基本上会根据实际给定的缓冲区将所有内容转移 1 次。这将使第一个位置为空,因此可以添加另一个字符。

我遇到的问题是原始缓冲区在我重置后似乎没有返回正确的值。

例如,当我这样做时:

temp->ca_head[0] = 'a';
temp->ca_head[1] = 'b';
temp->ca_head[2] = 'c';
temp->ca_head[3] = 'd';
temp->ca_head[4] = 'e';

b_reset(temp); //this will return the size as 0, when it's actually 5

//temp->ca_head[0] = 'i'; //if this is executed, it returns the size as 6 
                          //and prints out the right values, but if it's not, 
                          //it will not print out anything

printf("%d", ca_getsize(temp));
for(i = 0;i < ca_getsize(temp);++i)
{
    printf("%c", temp->ca_head[i]);
}

我知道这里出了点问题,但我不太确定是什么。任何建议将不胜感激。

4

3 回答 3

0

此代码基于您的后续评论:

好吧,我不是要调整缓冲区的大小,我只想在第一个位置创建一个空白空间,所以基本上将所有内容都向右移动了 1 次。假设缓冲区中有足够的空间来处理这个过程。

我认为除了最初的之外,您不需要做任何 malloc() 。您可以将所有内容循环上移:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>

#define R_FAIL_1 1

#define BUFFER_SIZE 10

typedef struct BufferDescriptor {
    char * ca_head ;
    int capacity ;
    char inc_factor;
    int addc_offset ;
    int mark_offset ;
    char r_flag;
    char mode;
} Buffer ;

void allocate_buffer(Buffer *pB, int size)
{
   pB->ca_head = malloc(size);
   assert(pB->ca_head);
   pB->capacity = size;
}

int ca_getsize( Buffer *pB)
{
   return pB->capacity;
}


int b_reset ( Buffer *pB )
{
   int i = 0;

   if (pB == NULL)
   {
      return R_FAIL_1;
   }
   else
   {
      if ( ca_getsize(pB) <= 0 || pB->ca_head == NULL ) 
         return R_FAIL_1;
   }
   // shift data up by 1 byte
   for( i = ca_getsize(pB) - 1 ; i > 0;i-- )
   {
      pB->ca_head[i] = pB->ca_head[i-1];
   }
   pB->ca_head[0] = '\0';
   return 0;
}

void print_buffer(Buffer *pB)
{
   printf("capacity: %d \n", ca_getsize(pB));
   for (int i = 0;i < ca_getsize(pB);++i)
   {
      printf("buffer(%d): [%d] ",i, pB->ca_head[i]);
   }
   printf("\n");
}


int main(void)
{
   Buffer a_buffer;
   allocate_buffer(&a_buffer,BUFFER_SIZE);
   strcpy(a_buffer.ca_head,"abcdefgh");
   print_buffer(&a_buffer);
   int ret = b_reset(&a_buffer);
   assert(ret == 0);
   print_buffer(&a_buffer);
}
于 2012-09-23T00:40:17.983 回答
0
    temp = (Buffer*)malloc(sizeof(Buffer*));

您需要分配足够的空间来保存 a Buffer,但您只分配足够的空间来保存指向缓冲区的指针。这应该是:

    temp = (Buffer*)malloc(sizeof(Buffer));
于 2012-09-22T20:57:09.327 回答
0

你不正确地管理你的记忆。实际上,您只需要处理 ca_head 成员的内存(如果我对您的作业问题的解释是正确的),您正在为新的 Buffer 结构分配内存。

每次调用 b_reset 时,都会为该结构分配不会被释放的内存。如果您没有正确处理您的记忆,您将遇到与您在问题中报告的结果一样的意外结果。

我建议你对函数 realloc 进行研究,并在你的 b_reset 函数中正确使用它。

祝你的家庭作业好运。

于 2012-09-22T21:14:11.483 回答