• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Char dynamiczna alokacja pamięci jak?

Object Storage Arubacloud
0 głosów
1,253 wizyt
pytanie zadane 13 kwietnia 2016 w C i C++ przez veryhotshark Obywatel (1,620 p.)
witam chciałbym żeby przy utworzeniu łańcucha char nie nadawać mu poczatkowej długości np. char zdanie[20];

tylko chciałbym żeby uzytkownik cin powiedział nam jak długie ma być zdanie więc jak to zrobić tak?

int ile;

cin>>ile;

char zdanie[ile];

to powyzej nie wygląda jakoś profesjonalnie i nie wiem czy działa czy jest jakiś sposób z uzyciem operatora New oraz wskaznika jak przy tablicach typu int?

4 odpowiedzi

+2 głosów
odpowiedź 13 kwietnia 2016 przez Dorion300 Szeryf (90,250 p.)
edycja 13 kwietnia 2016 przez Dorion300
char * zdanie = new char[ile];

 

komentarz 13 kwietnia 2016 przez MetGang Nałogowiec (34,360 p.)

I jak już nie używasz zmiennej to oczywiście:

delete[] zdanie;

 

komentarz 13 kwietnia 2016 przez veryhotshark Obywatel (1,620 p.)
a po new nie powinnismy napisac jaki typ nap. new int?
komentarz 13 kwietnia 2016 przez Dorion300 Szeryf (90,250 p.)
Wybacz, mój błąd, poprawiłem.
+1 głos
odpowiedź 13 kwietnia 2016 przez Sedi Stary wyjadacz (10,200 p.)

Zadziała. Jeśli masz C++:

char *zdanie=new char [ile];

Jeśli C, to analogicznie, z zastąpieniem new, malloc.

WAŻNE:

Pamiętaj, by później usunąć pamięć zajmowaną przez dynamiczną tablicę.

  • W C++:
delete [] zdanie;

W przypadku, C służy do tego free. Pamiętaj jednak, że prawidłową kombinacją jest połączenie new i delete. Lub malloc i free. Jeśli zrobisz np. malloc i delete będzie źle i dostaniesz zapewne crasha. 

Pozdrawiam

1
komentarz 13 kwietnia 2016 przez niezalogowany
#include <iostream>
#include <cstdlib>
int main()
{
  int a = 0;
  std::cin>>a;
  char *str = (char*)malloc(a*sizeof(char));
  std::cin>>str;
  std::cout<<str;
  delete []str;
}

Kompilowany na gcc 5.1 nie crashuje się. W każdym razie jest to UB więc nie powinno się tego robić.

komentarz 1 maja 2016 przez Ehlert Ekspert (212,670 p.)
Pary są określone jako malloc i free oraz new i delete. Niektóre kompilatory pozwalają na odstępstwa np rozmiar tablicy statycznej jako zmienna a nie stała. Edycja literałów łańcuchowych itp. To że jest to możliwe, to nic nie znaczy. Są to raczej niebezpieczne operacje.
komentarz 1 maja 2016 przez niezalogowany
Zmienna jako rozmiar zmiennej statycznej, na to pozwala GCC, który wspiera takie nieoficjalne standardy. A co do edycji literałów znakowych, jeśli jest definiowany tak: char* s = "text" to oprócz tego że nie jest to zgodne z standardem C++ to nie ma żadnego powodu dla którego kompilator miałby zabraniać np. czegoś takiego: s[1]='a'(oczywiście będzie crash jak by ktoś byl ciekaw dlaczego to wyjaśnienie jest w komentarzu do odpowiedzi Ehlerta).
0 głosów
odpowiedź 30 kwietnia 2016 przez JojololomenPL Bywalec (2,580 p.)

Użyj std::string z nagłówka <string>. info

0 głosów
odpowiedź 30 kwietnia 2016 przez Ehlert Ekspert (212,670 p.)

Jeśli nie piszesz w ANSI C to polecam porzucić tą metodę. Tworzysz tzw. literał łańcuchowy i patrząc na RAM komputera znajduje się on w tym samym miejscu co stałe. Dla c++ użyj std::string.

komentarz 1 maja 2016 przez niezalogowany

#include <cstdio>

int main(){
  const char* s = "ala ma kota";
  const int a = 0;
  std::printf("%p %p", (void*)s, &a);
}

Output:

000000000040c030 000000000022fe44

Uruchamiając w x64dbg  i patrzymy na mapę pamięci(sorry za krzywe linie): http://imgur.com/PnmFC3T

Jak widać literał znakowy został umieszczony w sekcji .rdata pliku wykonywalnego podczas gdy stała została umieszczona na stosie. Czyli literały znakowe i stałe nie są umieszczane w tym samym miejscu. Stała to zwykła zmienna umieszczana na stosie(chyba że jest globalna, to wtedy w sekcji .data), która jest pilnowana przez kompilator żeby nikt nie mógł modyfikować jej wartości. Wiem że to ma mały związek z tematem ale napisałem ten komentarz ze względu na to:

Tworzysz tzw. literał łańcuchowy i patrząc na RAM komputera znajduje się on w tym samym miejscu co stałe

komentarz 1 maja 2016 przez Ehlert Ekspert (212,670 p.)
Zgadzam się. Zmienna *s powstaje na stosie. Jest zmienną lokalną więc zgadza się. Jednak łańcuch znaków na który wskazuje jest zapisany jako stała (tylko do odczytu).

Podobne pytania

0 głosów
1 odpowiedź 358 wizyt
pytanie zadane 27 września 2016 w C i C++ przez Avernis Nałogowiec (27,400 p.)
0 głosów
2 odpowiedzi 184 wizyt
0 głosów
2 odpowiedzi 759 wizyt
pytanie zadane 6 kwietnia 2016 w C i C++ przez Barus Stary wyjadacz (14,120 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...