У меня проблема с моим кодом C. Мне нужно сделать функцию malloc. Прежде всего, это мой код:
#include <stdio.h>
#include <unistd.h>
#include "my-malloc.h"
#define MOST_RESTRICTING_TYPE double
// Pour s’aligner sur des frontieres multiples
// de la taille du type le plus contraignant
typedef union header {// Header de bloc
struct{
unsigned int size; // Taille du bloc
union header *ptr;// bloc libre suivant
} info;
MOST_RESTRICTING_TYPE dummy;// Ne sert qu’a provoquer un alignement
} Header;
/* Une version de my-malloc.c qu'il faudra vite remplacer par quelque chose de
* plus "raisonnable". Ce code n'est juste là que pour pouvoir lancer
* les programmes de test.
*/
static int nb_alloc = 0; /* Nombre de fois où on alloué */
static int nb_dealloc = 0; /* Nombre de fois où on désalloué */
static int nb_sbrk = 0; /* nombre de fois où a appelé sbrk */
static Header sentinelle;
void *mymalloc(size_t size) {
int sbrkUsage=0;
static Header *bloc;
static Header *nextBloc;
nb_alloc += 1;
printf("mymalloc(%zu)\n",size);
if(bloc==NULL){
bloc=&sentinelle;
sentinelle.info.size=0;
sentinelle.info.ptr=bloc;
}
Header *ptr = &sentinelle;
Header *ptr_prec = &sentinelle;
while((ptr=ptr->info.ptr)!=&sentinelle){
ptr_prec=ptr;
if(ptr->info.size >= (size+sizeof(Header)))
break;
}
if(ptr==&sentinelle){
if((bloc=sbrk(800))==(void *)-1){
printf("ERREUR\n");
}
nb_sbrk++;
printf("\t-->sbrk(800)\n");
sbrkUsage=1;
bloc->info.size=800;
bloc->info.ptr=&sentinelle;
ptr_prec->info.ptr=bloc;
}
if(sbrkUsage==0){
bloc->info.size=size+sizeof(Header);
nextBloc=bloc+size+sizeof(Header);
nextBloc->info.size=((ptr->info.size)-(size+sizeof(Header)));
}
else{
nextBloc=bloc+size+sizeof(Header);
printf("PASSE ? %zu\n",800-(size+sizeof(Header)));
nextBloc->info.size=((800)-(size+sizeof(Header)));
printf("PASSE ? %zu\n",800-(size+sizeof(Header)));
}
printf("sizeptr : %d\n",ptr->info.size);
nextBloc->info.ptr=&sentinelle;
ptr_prec->info.ptr=nextBloc;
bloc->info.ptr=nextBloc;
sentinelle.info.ptr=nextBloc;
//printf("returned : %p\n",&bloc);
return bloc;
}
void myfree(void *ptr) {
nb_dealloc += 1;
free(ptr);
}
void *mycalloc(size_t nmemb, size_t size) {
nb_alloc += 1;
return calloc(nmemb, size);
}
void *myrealloc(void *ptr, size_t size) {
/* il faudrait probablement changer les valeur de nballoc et
* nb_dealloc dans une véritable implémentation
*/
return realloc(ptr, size);
}
#ifdef MALLOC_DBG
void mymalloc_infos(char *msg) {
if (msg) fprintf(stderr, "**********\n*** %s\n", msg);
fprintf(stderr, "# allocs = %3d - # deallocs = %3d - # sbrk = %3d\n",
nb_alloc, nb_dealloc, nb_sbrk);
/* Ca pourrait être pas mal d'afficher ici les blocs dans la liste libre */
if (msg) fprintf(stderr, "**********\n\n");
}
#endif
И я не понимаю, почему у меня здесь segfault:
printf("PASSE ? %zu\n",800-(size+sizeof(Header)));
nextBloc->info.size=((800)-(size+sizeof(Header)));
printf("PASSE ? %zu\n",800-(size+sizeof(Header)));
Я на нем в течение 2 часов и не могу найти ошибку ...
если кто-то может мне помочь, это будет здорово. Спасибо.
nextBloc=bloc+size+sizeof(Header);
- вы знакомы с арифметикой указателей? Я подозреваю, что это проблема. - person user4520   schedule 26.05.2015nextBloc=bloc+size+sizeof(Header);
, посколькуnextBloc
является указателем, а вашnextblock
должен быть равен ссылке блока&bloc+size+sizeof(Header);
- person Vinay Shukla   schedule 26.05.2015&bloc
будетstruct Header**
. Это С, а не С++. - person user4520   schedule 26.05.2015p + X
, а наp + size_of_X_type * X
; другими словами, если у вас естьint* p
и его значение равно0x1234
, тоp+1
равно0x1238
, а не0x1235
.nextBloc=bloc+size+sizeof(Header);
заставляетnextBloc
указывать на память далеко-далеко от того, что вы хотели, отсюда и нарушение прав доступа. - person user4520   schedule 26.05.2015sbrk()
, вы не можете использовать предоставленные системой вызовыmalloc()
. Я не вижу никаких доказательств того, что вы полностью заменили их. Во-вторых, как только вы полностью замените все вызовы всех подпрограммmalloc()
, вы не сможете вызывать функции (такие какprintf()
), которые сами могут вызывать подпрограммыmalloc()
. - person Andrew Henle   schedule 26.05.2015