#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 целых памяти. Также спасибо, что указали на проблему с количеством элементов, которая решила мою проблему 🙂