• 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?

VPS Starter Arubacloud
0 głosów
1,462 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 (214,220 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 (214,220 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 (214,220 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ź 421 wizyt
pytanie zadane 27 września 2016 w C i C++ przez Avernis Nałogowiec (27,400 p.)
0 głosów
2 odpowiedzi 230 wizyt
0 głosów
2 odpowiedzi 1,005 wizyt
pytanie zadane 6 kwietnia 2016 w C i C++ przez Barus Stary wyjadacz (14,120 p.)

93,020 zapytań

141,982 odpowiedzi

321,283 komentarzy

62,366 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

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...