2d массив получает нежелательные дополнительные элементы

#c #arrays #pointers

#c #массивы #указатели

Вопрос:

Это мой первый пост, но я уже некоторое время пользуюсь этим сайтом, и это было очень полезно.

Я нахожусь в процессе написания реализации пула памяти, но столкнулся со странной проблемой. Прямо сейчас у меня есть 2 пула памяти, возникает странная проблема: всякий раз, когда я инициализирую их оба, в первом массиве будет на 1 элемент больше, чем должно быть. Для каждого пула, который я добавляю помимо первого, он получает дополнительный элемент. Это не предполагается, и я понятия не имею, почему.

В моем коде первый пул содержит 32 элемента (0 — 31), что работает нормально, но когда я инициализирую второй пул, он показывает, что в нем 33 элемента (0 — 32).

Вот мой код :

 #include <stdio.h>
typedef struct memoryBlock {
    /* Pointer to array */
    int *Address;                                                
    struct memoryBlock *Next;
}memoryBlock;


/* Small Pool */
#define BLOCKNUM_POOL_S 32 //number of blocks
#define BLOCKSIZE_POOL_S 8 //ints per block

static memoryBlock *Pool_Head_S;
static memoryBlock *Pool_Tail_S;

 /* The memory that will be dynamically allocated will be stored in this array */
static int Pool_Block_S[BLOCKNUM_POOL_S-1][BLOCKSIZE_POOL_S sizeof(memoryBlock)/sizeof(int)];       

/* This is a free list containing only pointers to free blocks in this pool */
static int Pool_Free_S[BLOCKNUM_POOL_S-1][sizeof(memoryBlock)/sizeof(int)]; 


/* Medium Pool */
#define BLOCKNUM_POOL_M 16 //number of blocks
#define BLOCKSIZE_POOL_M 16 //words per block

static memoryBlock *Pool_Head_M;
static memoryBlock *Pool_Tail_M;

/* The memory that will be dynamically allocated will be stored in this array */
static int Pool_Block_M[BLOCKNUM_POOL_M-1][BLOCKSIZE_POOL_M sizeof(memoryBlock)/sizeof(int)];           

/* This is a free list containing only pointers to free blocks in this pool */
static int Pool_Free_M[BLOCKNUM_POOL_M-1][sizeof(memoryBlock)/sizeof(int)];


void printS();
void printM();
void initPool_S();
void initPool_M();

void main(){

  initPool_S();
  initPool_M();

  printS();
  printM();

}

void initPool_S(){
   int i;  
   Pool_Tail_S = NULL;
   Pool_Head_S = NULL;
   for(i=0;i<BLOCKNUM_POOL_S;i  ){  
      //for each block setup the memory block and pointers
      if(Pool_Tail_S){          
          Pool_Tail_S->Next = (memoryBlock *)amp;Pool_Free_S[i][0];
          Pool_Tail_S->Next->Address = amp;Pool_Block_S[i][0];
          Pool_Tail_S = Pool_Tail_S->Next;
          Pool_Tail_S->Next = NULL;
      /* There is nothing in this list yet */
      }else{
          Pool_Head_S = (memoryBlock *)amp;Pool_Free_S[i][0];
          Pool_Head_S->Address = (int *)amp;Pool_Block_S[i][0];
          Pool_Head_S->Next = NULL;
          Pool_Tail_S = Pool_Head_S;
      }
   }
}

void initPool_M(){
   int i;
   Pool_Tail_M = NULL;
   Pool_Head_M = NULL;
   for(i=0;i<BLOCKNUM_POOL_M;i  ){
        //for each block setup the memory block and pointers
        if(Pool_Tail_M){
            Pool_Tail_M->Next = (memoryBlock *)amp;Pool_Free_M[i][0];
            Pool_Tail_M->Next->Address = (int *)amp;Pool_Block_M[i][0];
            Pool_Tail_M = Pool_Tail_M->Next;
            Pool_Tail_M->Next = NULL;
        /* There is nothing in this list yet */
        }else{
            Pool_Head_M = (memoryBlock *)amp;Pool_Free_M[i][0];
            Pool_Head_M->Address = (int *)amp;Pool_Block_M[i][0];
            Pool_Head_M->Next = NULL;
            Pool_Tail_M = Pool_Head_M; 
        }      
   }
}

void printM(){
    memoryBlock *tmpPtr2;
    tmpPtr2 = Pool_Head_M;
    int j=0;
    while(tmpPtr2){
        printf(">-------------------------------------------------<n");
        printf("%dn",j);
        printf("Pool_Med_Free: %dn",tmpPtr2);
        printf("Pool_Med_Free->Address: %dn",tmpPtr2->Address);
        printf("Pool_Med_Free->Next: %dn",tmpPtr2->Next);
        tmpPtr2 = tmpPtr2->Next;
        j  ;
    }
}

void printS(){
  memoryBlock *tmpPtr1;
  tmpPtr1 = Pool_Head_S;
  int j=0;
  while(tmpPtr1){
      printf(">-------------------------------------------------<n");
      printf("%dn",j);
      printf("Pool_Small_Free: %dn",tmpPtr1);
      printf("Pool_Small_Free->Address: %dn",tmpPtr1->Address);
      printf("Pool_Small_Free->Next: %dn",tmpPtr1->Next);
      tmpPtr1 = tmpPtr1->Next;
      j  ;
  }
}
 

Также компилятором, который я использую, является MinGW.

Я все еще немного новичок в C, так что это, вероятно, глупая ошибка, но, похоже, я не могу ее решить. Любая помощь будет оценена, спасибо!

Ответ №1:

Pool_Block_S[BLOCKNUM_POOL_S-1] имеет только 31 элемент. n in array[n] — это количество элементов, а не индекс последнего элемента. Это источник вашей проблемы.

В чем смысл sizeof(memoryBlock)/sizeof(int) ? Это выглядит неправильно.

Комментарии:

1. Спасибо за ответ, sizeof(memoryBlock) / sizeof(int) означает: размер memoryBlock в байтах / размер 1 int в байтах. На моей машине struct составляет 8 байт, а int равен 4. это означает, что для хранения структуры внутри массива требуется 8/4 = 2 целых памяти. Также спасибо, что указали на проблему с количеством элементов, которая решила мою проблему 🙂