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