Portál AbcLinuxu, 16. května 2025 10:29

Dotaz: „corrupted size vs. prev_size“

3.8.2018 18:16 c
„corrupted size vs. prev_size“
Přečteno: 3144×
Odpovědět | Admin
Program mi pocas behu skonci chybou:
corrupted size vs. prev_size
Jedna sa o jednoduchy program. Vo vykonavai programi nepouzivam ani malloc/realloc. Iba signal() a kill().

Netusim, co moze byt zle.

Prejavuje sa to raz zo 200 krat vykonavania programu.
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

3.8.2018 20:09 rastos | skóre: 63 | blog: rastos
Rozbalit Rozbalit vše Re: „corrupted size vs. prev_size“
Odpovědět | | Sbalit | Link | Blokovat | Admin
Ak dobre chápem, tak ide o hlášku z runtime knižnice, ktorá hlási poškodenie heap-u. Môžeš to pustiť pod Valgrind-om? Používaš tam nejaké polia? Pointre?
6.8.2018 12:14 c
Rozbalit Rozbalit vše Re: „corrupted size vs. prev_size“
Spustil som to, ale chyba sa prejavuje 1 zo 100-1000 spusteni, takze to trocha potrva. Ake tam parametre mam pouzit?

Maximalne malloc a free. ... pointre pouzivam .... spracovanie textovych suborov ...
6.8.2018 14:06 rastos | skóre: 63 | blog: rastos
Rozbalit Rozbalit vše Re: „corrupted size vs. prev_size“
Parametre valgrindu? V prvom kole žiadne. Ja občas používam --leak-check=full. Ale tu asi nejde o leakovanie pamäte, ale asi double-free, alebo pointer, čo smeruje nikam úplne mimo.

Odporučil by som každé "free(p);" zmeniť na "free(p);p=NULL;".
6.8.2018 16:26 c
Rozbalit Rozbalit vše Re: „corrupted size vs. prev_size“
Asi som nasiel chybu po pouzitia valgrinda.

Mam implementaciu
char *strcat_malloc(char *s1, char *s2)
a vysledna dlzka retazca je:
strlen(s1)+strlen(s2)
a ja som dal:
strlen(s1)+strlen(s2)+1
6.8.2018 19:27 rastos | skóre: 63 | blog: rastos
Rozbalit Rozbalit vše Re: „corrupted size vs. prev_size“
const char *s1="a";
const char *s2="bc";

strlen(s1)+strlen(s2); // znamená: strlen(s1)==1, strlen(s2)==2, na reťazec "abc" potrebuješ alokovať 4 bajty
char *result=malloc(strlen(s1)+strlen(s2)+1); // je 1+2+1=4 a to je správne
strcpy(result,s1);
strcat(result,s2);
Ale keď, už raz valgrind na niečo ukáže, tak sa tam treba dobre poobzerať.
6.8.2018 22:01 c
Rozbalit Rozbalit vše Re: „corrupted size vs. prev_size“
char *strcat_malloc(const char *first, const char *second)
{
	long int l1;
	long int l2;
	long int lenght;
	
	char *ret;
	
	if(first == NULL || second == NULL)
		return NULL;
	
	l1=strlen(first);
	l2=strlen(second);
	
	lenght=l1+l2+1;
	ret=(char *) malloc(lenght);
	if(ret == NULL)
		return NULL;
		
	bzero(ret,lenght);
	
	memcpy(ret, first, l1);
	memcpy(ret+l1, second, l2);
	ret[l1+l2]='\0';
	
	return ret;
}
6.8.2018 23:01 rastos | skóre: 63 | blog: rastos
Rozbalit Rozbalit vše Re: „corrupted size vs. prev_size“
Tam chyba nie je. Možno v pointroch, ktoré tam prídu ako parameter.
7.8.2018 07:44 c
Rozbalit Rozbalit vše Re: „corrupted size vs. prev_size“
To je uz opravene.

Chybny riadok tam bol:
ret[l1+l2+1]='\0';
ktory som opravil na
ret[l1+l2]='\0';
Ak by som vobec nemal ten riadok, tak funkcia by fungovala spravne (alokovanu pamet nulujem, aj poziciu pre \0)

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.