0

私は宿題に取り組んでおり、基本的に文字バッファを作成する必要があります。作成する必要のある関数の1つは、「b_reset」と呼ばれます。目的は、指定されたバッファを再初期化して、charバッファの最初の位置を指すようにすることです。これが必要なのは、後で新しい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
    temp = (Buffer*)malloc(sizeof(Buffer*));

を保持するのに十分なスペースを割り当てる必要があり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 に答える
0

このコードはあなたのフォローアップコメントに基づいています:

バッファのサイズを変更しようとしているのではなく、最初の位置に空のスペースを作成したいので、基本的にすべてを1回右にシフトします。このプロセスを処理するのに十分なスペースがバッファーにあることを前提としています。

最初のmalloc()を超えて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 に答える