Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

"new char[x]" alokuje zbyt dużo pamięci

Ostatnio zmodyfikowano 2014-10-12 22:12
Autor Wiadomość
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
C/C++
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:
C/C++
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?
P-118219
1aam2am1
» 2014-10-10 23:46:10
strlen liczy długość stringa a nie zarezerwowanej pamięci
P-118220
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)?
P-118221
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.
P-118223
fokusx
Temat założony przez niniejszego użytkownika
» 2014-10-12 01:57:03
Jeszcze takie małe pytanko.

Mając kod
C/C++
char * buff;
buff = new char[ 3 ];
buff[ 0 ] = 'a';
buff[ 1 ] = 'b';
buff[ 2 ] = 'c';
 zrobiłem błąd i dopisałem dodatkową linijkę:
C/C++
buff[ 3 ] = '\0';

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:
C/C++
delete[] buff;
buff = new char[ 156 ];
Kompilator nadal nie protestował ale program posypał się.
P-118314
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ę.
P-118316
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.
P-118318
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.
P-118319
« 1 » 2
  Strona 1 z 2 Następna strona