Проблемы с динамическим распределением памяти: main: malloc.c: 3096: sYSMALLOc - PullRequest
2 голосов
/ 06 января 2011

Я пишу простую функцию для создания списка, который представляет колоду карт. Вот определение структур

typedef struct {
 float valoreEff;
 char *seme;
 char *valore;
 } carta;

struct Mazzo {
 carta info;
 struct Mazzo *nextPtr;
 };


typedef struct Mazzo mazzo;
typedef mazzo *mazzoPtr;

Вот функция, которая возвращает указатель на первый элемент списка

mazzoPtr caricaMazzo(void){

 mazzoPtr sMazzoPtr=NULL;
 int val,seme;
 carta buffer;
 mazzoPtr newPtr;
  char *tabValori[10]={"Asso","Due","Tre","Quattro","Cinque","Sei","Sette","Donna","Cavallo","Re"};
  char *tabSeme[4]={"Denari","Spade","Coppe","Bastoni"};

 for(seme=0;seme<4;seme++){
  for(val=0;val<10;val++){
   buffer.seme=tabSeme[seme];
   buffer.valore=tabValori[val];
   if (val<=7) {
    buffer.valoreEff=val+1;
   }
   else {
    buffer.valoreEff=0.5;
   }
   printf("ok\n");
   newPtr=malloc(sizeof(carta));
   if (newPtr==NULL){
    printf("Memoria insufficiente\n");
    return NULL;
   }
   newPtr->info=buffer;
   newPtr->nextPtr=sMazzoPtr;
   sMazzoPtr=newPtr;
  }
 }
 return sMazzoPtr;
}

GCC не дает мне ошибок во время компиляции, но когда я запускаю программу, это вывод

ok
ok
main: malloc.c:3096: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *)
&((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd))))
&& old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)
((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 *
(sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size
& 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed.
Aborted

Я также пробовал Valgrind, но не могу понять ошибку в коде.

==21848== Invalid write of size 4
==21848==    at 0x8048554: caricaMazzo (in /home/gianluca/Dropbox/PROGRAMMI/progetto/main)
==21848==    by 0x8048431: main (in /home/gianluca/Dropbox/PROGRAMMI/progetto/main)
==21848==  Address 0x419e034 is 0 bytes after a block of size 12 alloc'd
==21848==    at 0x4025BD3: malloc (vg_replace_malloc.c:236)
==21848==    by 0x804851D: caricaMazzo (in /home/gianluca/Dropbox/PROGRAMMI/progetto/main)
==21848==    by 0x8048431: main (in /home/gianluca/Dropbox/PROGRAMMI/progetto/main)
==21848== 

Надеюсь, вы мне поможете:)

Ответы [ 2 ]

5 голосов
/ 06 января 2011

Проблема, кажется, на линии, где вы звоните malloc().

newPtr имеет тип mazzo*, но вы выделяете место для carta, что слишком мало.

Я думаю, это должно быть newPtr=malloc(sizeof(mazzo));

0 голосов
/ 09 января 2011

Хотя это, возможно, не вариант для вас, вам будет лучше использовать C ++. Среди множества преимуществ разработки программного обеспечения, его new идиома для выделения памяти предотвращает именно этот тип ошибки, так как вы должны явно использовать тип объекта: newPtr = new mazzo;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...