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

dynamiczne alokawanie pmięci

VPS Starter Arubacloud
0 głosów
121 wizyt
pytanie zadane 15 grudnia 2016 w C i C++ przez adam1297 Użytkownik (630 p.)
Witam,

mam kłopoty z funkcją  która ma  zwracać wskaźnik do struktury zawierającej dwa elementy łańcuch znaków oraz długośc tego łancucha(bez końcowego pustego znaku), jednak po wywołaniu wyskakuje error, wie ktoś gdzię popełnilem błąd?

http://wklej.org/id/2990269/

1 odpowiedź

+1 głos
odpowiedź 15 grudnia 2016 przez operator Stary wyjadacz (10,920 p.)
16. d = (MyString*)malloc(sizeof(MyString)*(strlen(p))); <- Tutaj wystarczy tylko sizeof(MyString) ERROR, a raczej wyciek danych.

Od 13 do 23 jest straszne zamieszanie. Struktura stworzy się zawsze. Możesz patrzeć na rozmiar Char* wejściowego i wtedy zwracać null dla pustego stringa. Musisz skopiować dane wejściowe do struktury w której masz tylko wskaźnik na tablicę więc trzeba do tego wskaźnika przypisać przestrzeń rozmiaru danych wejściowych i wykonać kopiowanie za pomocą funkcji strcpy z biblioteki string.
komentarz 15 grudnia 2016 przez adam1297 Użytkownik (630 p.)
Coś w tym guście?

MyString *CreateStr(const char* p){
MyString *d;
int i;
d=(MyString*)malloc(sizeof(MyString));
if (!strlen(p)){
    d->n=0;
    d->str=NULL;
    puts("nope");
}
else{
        d->str=(char*)malloc(sizeof(char)*strlen(p));
        strcpy(d->str,p);
        d->n=strlen(p);
    }
return d;
}
komentarz 16 grudnia 2016 przez operator Stary wyjadacz (10,920 p.)
!strlen(p) zamieniłbym na strlen(p) == 0 albo w ogóle ten warunek skasował. String może być pusty czemu nie. Przekazujesz do funkcji const char, a w main masz char. Ten const może być kompilowany ale potem może też powodować problemy.
komentarz 16 grudnia 2016 przez maly Nałogowiec (37,190 p.)

!strlen(p) zamieniłbym na strlen(p) == 0

Te zapisy są równoznaczne więc po co, na co i dlaczego?

Przekazujesz do funkcji const char, a w main masz char. Ten const może być kompilowany ale potem może też powodować problemy.

W tym przypadku const powinien tam być, zabezpiecza to przed próbą modyfikacji cstring-a w funkcji i umożliwia wywołanie jej w taki sposób:

MyString *str = CreateStr("ala ma kota");

 

Podobne pytania

0 głosów
1 odpowiedź 492 wizyt
pytanie zadane 15 listopada 2017 w C i C++ przez kosttek Początkujący (450 p.)
0 głosów
1 odpowiedź 304 wizyt
0 głosów
1 odpowiedź 173 wizyt
pytanie zadane 19 października 2016 w C i C++ przez Evelek Nałogowiec (28,960 p.)

92,455 zapytań

141,263 odpowiedzi

319,099 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...