Aktywne Wpisy

damianooo8 +326
#trzecieoko #wypadki
Chłop myślał że jak ma stare BMW X5 to może tirowi na czołówkę wyjeżdżać. Akcja z wczoraj z Rosji. Zginęła cała rodzina.
Chłop myślał że jak ma stare BMW X5 to może tirowi na czołówkę wyjeżdżać. Akcja z wczoraj z Rosji. Zginęła cała rodzina.


trebeter +90






Mam taki kod:
#include
#include
#include
#include
``````
char* getRandomString(intaCount);
``````
intmain()
{
char* ptr;
while(1){
ptr = getRandomString(255);
free(ptr);
printf(
"%s\n", ptr);
sleep(1);
}
``````
return0;
}
``````
char* getRandomString(intaCount)
{
intiCharType;
charcChar;
char* pcDest;
``````
if(aCount <= 0)
returnpcDest =NULL;``````
pcDest = (
char*)malloc(sizeof(char)*(aCount+1));``````
/* initialize random seed: */
srand (time(
NULL));
``````
while(aCount--)
{
iCharType = rand() % 3; // Rand type of char (Num, Upper case, Lower case)
``````
switch(iCharType)
{
case0 : cChar = rand() % 10;
cChar += 48; // We need number
break;
case1 : cChar = rand() % 26;
cChar += 65; // We need capital letter
break;
case2 : cChar = rand() % 26;
cChar += 97; // We need small letter
break;
}
strncat(pcDest, &cChar, 1);
}
``````
returnpcDest;
}
Jest funkcja getRandomString() która alokuje pamięć i zwraca do niej adres.
W main jest pętla która do wskaźnika ptr przypisuje adres jaki dosteje od f. getRandomString(), później zwalnia pamieć pod ptr, czeka sekunde, ponownie przypisuje, zwalnia i... wyrzuca mnie z programu z błędem typu:
albo
Dlaczego tak się dzieje?
To jest pozostałość po tym jak przy pomocy printów próbowałem debuguwać program.
ten printf() jest nieszkodliwy, można go spokojnie wyrzucić, program dalej się wysypie.
Edit:
W którym miejscu funkcji dopisujesz na końcu ciągu znakowego '\0' ?
http://linux.die.net/man/3/strcat
Funkcja getRandomString(), robi raczej to czego od niej wymagam. Nie rozumiem tylko dlaczego, gdy do ptr przypisze wynik tej funkcji, to ptr powinien wskazywać na adres zaalokowany przez malloc() wewnątrz tej funkcji.
W takim razie wykonanie free() na ptr jest wskazane kiedy nie potrzebuje już korzystać z tego stringa, problem polega na tym, że gdy jeszcze raz do ptr przypisze wynik mojej
String jest zakończony dobrze.
strncpy() przyjmuje trzy argumenty. CEL, ZRODLO oraz DLUGOSC.
ZRODLO oraz CEL to cstringi - char*.
DLUGOSC określa ile znaków ze ZRODLA mają być przekopiowane do celu.
W CELU funkcja ta szuka znaku \0, usuwa go, dodaje tyle znaków ze ZRODLA ile wynosi długość i dodaje na końcu \0.
Nie używa realloc(), CEL musi być odpowiednio duży by
Nadpisujesz pamięć bo za drugim razem malloc zwraca ci do pcDest ten sam adres i tam pierwszy null jest już na pozycji ostatniej możliwej. Przypisanie cchar następuje poza zasięgiem ptr.
Najlepiej po malloc wyzeruj pamięć.
Czyli tutaj wszystko działa.
Jak sprawdzałem przy pomocy printf("%p", ptr) to za każdym razem ptr wskazywał na inny adres.
Tutaj też wszystko