2011-01-06 4 views
2

카드 덱을 나타내는 간단한 함수를 작성하고 있습니다. 여기 여기메모리 동적 할당 문제 : main : malloc.c : 3096 : sYSMALLOc

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 나에게 더 컴파일 시간 오류를 제공하지리스트의 첫 번째 요소에 대한 포인터를 반환하는 기능 년대 구조체

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

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


typedef struct Mazzo mazzo; 
typedef mazzo *mazzoPtr; 

의 정의,하지만이 프로그램을 실행할 때 , 이것은 출력입니다

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== 

난 당신이 날 도울 수 있기를 바랍니다 :)

답변

5

문제는 당신이 malloc() 부르는 줄 것으로 보인다.

newPtrmazzo* 유형이지만 carta의 공간을 할당하는 것은 너무 작습니다.

내가이, 당신은 C++을 사용하여 더 나을 것이다 당신을위한 옵션이 될 수는 없지만이 newPtr=malloc(sizeof(mazzo));

+4

명시 적으로 객체 유형을 사용해야하므로 메모리를 할당하는 데 사용되는 new 관용구는 이러한 유형의 오류를 정확하게 방지합니다. 추가적으로 - 다음과 같은 관용구를 사용하여 이러한 유형의 오류를 예방할 수 있습니다. 'newPtr = malloc (sizeof (* newPtr));'- 그런 식으로 포인터가 무엇이든간에 타입은 도움이되지 않지만 정확할 수 있습니다. 그리고 나중에 코드를 읽는 누군가는'sizeof' 피연산자의 타입이 할당 된 포인터에 대해 정확한지 확인하기 위해 소스에서 뛰어 넘을 필요가 없습니다. –

0

있어야한다고 생각합니다. 많은 소프트웨어 엔지니어링 이점 중,