Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
内存动态分配问题:main:malloc.c:3096:sYSMALLOc_C_List_Memory_Malloc_Valgrind - Fatal编程技术网

内存动态分配问题:main:malloc.c:3096:sYSMALLOc

内存动态分配问题:main:malloc.c:3096:sYSMALLOc,c,list,memory,malloc,valgrind,C,List,Memory,Malloc,Valgrind,我正在编写一个简单的函数来创建一个代表一副牌的列表。 下面是结构的定义 typedef struct { float valoreEff; char *seme; char *valore; } carta; struct Mazzo { carta info; struct Mazzo *nextPtr; }; typedef struct Mazzo mazzo; typedef mazzo *mazzoPtr; 下面是一个函数,它返回指向列表第一个元素的指针 mazz

我正在编写一个简单的函数来创建一个代表一副牌的列表。 下面是结构的定义

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;
}
我也试过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== 

我希望您能帮助我:)

问题似乎出在您调用
malloc()
的线路上

newPtr
属于
mazzo*
类型,但您正在为
carta
分配空间,该空间太小


我认为应该是
newPtr=malloc(sizeof(mazzo)) 

虽然这可能不是你的选择,但最好还是使用C++。在它的许多软件工程好处中,它的
new
分配内存的习惯用法正好防止了这种错误,因为您必须显式使用对象类型:
newPtr=newmazzo

作为旁白-您通常可以使用习惯用法
newPtr=malloc(sizeof(*newPtr)),来防止这种类型的错误-这样,指针的类型只能是正确的。稍后阅读代码的人不需要在源代码中来回跳转,以确保
sizeof
操作数的类型对于指定的指针是正确的。
==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==