"new char[x]" alokuje zbyt dużo pamięci
Ostatnio zmodyfikowano 2014-10-12 22:12
fokusx Temat założony przez niniejszego użytkownika |
"new char[x]" alokuje zbyt dużo pamięci » 2014-10-10 23:35:01 Z jakiegoś dziwnego powodu funkcja char * tmp = new char[ x ];
rezerwuje zbyt dużo pamięci... Wyświetla odpowiednio wartości: x strlen(x) _____________________ 3 16 4 16 5 24 Cały fragment kodu: char * tmp = new char[ i + 1 ]; printf( "\ni + 1: %i, strlen: %i\n", i + 1, strlen( tmp ) ); for( int k = 0; k <= i; k++ ) { tmp[ k ] = buff[ k ]; } printf( "\n%s\n", tmp ); return tmp;
Gdzie jest błąd? |
|
1aam2am1 |
» 2014-10-10 23:46:10 strlen liczy długość stringa a nie zarezerwowanej pamięci |
|
fokusx Temat założony przez niniejszego użytkownika |
» 2014-10-11 00:11:47 W takim razie dlaczego printf("%s", tmp); wyświetla mi: "(jghjg)řřřřźźźźźźźź■ţ■ţ■" zamiast "(jghjg)" (tylko)?
|
|
OSA_PL |
» 2014-10-11 01:07:25 Bo printf wypisuje znaki dopóki nie natrafi na znak '\0', a Ty takiego po ')' nie masz. |
|
fokusx Temat założony przez niniejszego użytkownika |
» 2014-10-12 01:57:03 Jeszcze takie małe pytanko. Mając kod char * buff; buff = new char[ 3 ]; buff[ 0 ] = 'a'; buff[ 1 ] = 'b'; buff[ 2 ] = 'c';
zrobiłem błąd i dopisałem dodatkową linijkę: Kompilator nie protestował, sam program też nie. Dlaczego to przeszło? Zauważyłem błąd dopiero przy próbie zwolnienia pamięci i próbie alokowania jej ponownie: delete[] buff; buff = new char[ 156 ];
Kompilator nadal nie protestował ale program posypał się. |
|
Jacob99 |
» 2014-10-12 09:04:30 bo nie jest to błąd. '\0' to specjalny znak oznaczający NULL, więc czemu kompilator miałbu ci to wyrzucać? Ale dziwne jest, że program ci się nie posypał od razu, bo wychodzisz za tablicę. |
|
pekfos |
» 2014-10-12 10:06:06 Kompilator nie protestował |
Kompilator nadal nie protestował |
Jakby zawsze wiedział, co masz na myśli, to nie byłbyś do niczego potrzebny przy pisaniu programu.. Ale dziwne jest, że program ci się nie posypał od razu, bo wychodzisz za tablicę. |
Nie jest. |
|
DejaVu |
» 2014-10-12 10:56:43 System Windows/Unix przydziela zazwyczaj nie mniej niż krotność 4 bajtów, więc nawet jeżeli oczekujesz jednego, dwóch czy trzech bajtów to i tak dostaniesz od systemu 4 bajty. Pomimo to nie należy bazować na tej własności i tym samym nie można nigdy wykraczać poza zarezerwowany obszar pamięci. Jak byś użył std::vector to byś dostał wyjątek out_of_range. |
|
« 1 » 2 |