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

Błąd przy łancuchy i alokacji pamięci miejscowej

Aruba Cloud - Virtual Private Server VPS
0 głosów
347 wizyt
pytanie zadane 27 kwietnia 2018 w C i C++ przez Sic Dyskutant (8,510 p.)
edycja 27 kwietnia 2018 przez Sic

Witam mam problem z łańcuchem znaków i alokacją miejscową pamięci oto kod:

#include <iostream>
#include <new>

struct chaff
{
        char dross[20];
        int slag;
};
int main()
  {      char tab[20], tab_2[20];
        chaff * p1, *p2;
        p1 = new(tab) chaff; //miejscowe przypisanie pamieci
        p1->dross = "ciag znaków";
}
komentarz 27 kwietnia 2018 przez Patrycjerz Mędrzec (192,320 p.)
Ten kod nie ma prawa się skompilować. Wyrażenia muszą się znajdować w funkcjach.
komentarz 27 kwietnia 2018 przez Sic Dyskutant (8,510 p.)
Kod został poprawiony

2 odpowiedzi

+1 głos
odpowiedź 27 kwietnia 2018 przez Qwerty96 Stary wyjadacz (13,580 p.)
wybrane 27 kwietnia 2018 przez Sic
 
Najlepsza
p1->dross = "ciag znaków";

Tablica charów to nie std::string. Takie przypisanie nie ma sensu. Użyj funkcji strcpy.

komentarz 27 kwietnia 2018 przez Sic Dyskutant (8,510 p.)
edycja 27 kwietnia 2018 przez Sic

użyłem w dalszej części na kopie.

#include <iostream>
#include <new>
#include <cstring>
struct chaff
{
        char dross[20];
        int slag;
};

int main()
{
        char tab[30], tab_2[30];
        chaff * p1, *p2;
        p1 = new(tab) chaff; //miejscowe przypisanie pamieci
        strcpy(p1->dross, "ciag znaków");
        std::cout << "Przed kopiowaniem: " << p1->dross << "\nadres \"p1.dross\": " << &p1->dross << std::endl;
        strcpy (tab, p1->dross);
        std::cout << "SKopiowane: " << tab << "\nadres \"tab\": " << &tab << std::endl;

        p2 = new chaff;
        strcpy(p2->dross, "asfasfafs");
        std::cout << "\n\nPrzed kopiowanie: " << p2->dross << "\nadres \"p2.dross\": " << &p2->dross << std::endl;
        strcpy(tab_2, p2->dross);
        std::cout << "Skopiowane: " << tab_2 << "\nades \"tab_2\": " << &tab_2 << std::endl;
        delete [] p2;
        return 0;
}

zadziałało, jednak dalej mam błąd

warning: placement new constructing an object of type ‘chaff’ and size ‘224’ in a region of type ‘char [30]’ and size ‘30’ [-Wplacement-new=]
  p1 = new(tab) chaff; //miejscowe przypisanie pamieci

Dlaczego, sprawdzałem to kilku krotnie i powinno się kompilować

1
komentarz 27 kwietnia 2018 przez Patrycjerz Mędrzec (192,320 p.)
strcpy (tab, p1->dross);

Oba fragmenty pamięci nakładają się na siebie. W tym przypadku będzie undefined behaviour.

delete [] p2;

Tej wersji delete używa się dla pamięci zaalokowanej new[].

komentarz 27 kwietnia 2018 przez Sic Dyskutant (8,510 p.)
Dziękuję, udało mi się naprawić ten błąd. Nie wiedziałem, że to może spowodować błąd kompilacji dziękuję jeszcze raz.
1
komentarz 27 kwietnia 2018 przez Patrycjerz Mędrzec (192,320 p.)
To nie błąd kompilacji, to ostrzeżenie. Tak w ogóle, jeśli dobrze rozumiem komunikat, typ chaff nie powinien mieć rozmiaru aż 224. Trudno mi cokolwiek na ten temat powiedzieć.
komentarz 27 kwietnia 2018 przez mokrowski Mędrzec (158,200 p.)

Jeśli chcesz uniknąć częściowo problemów z pilnowaniem wielkości buforów, możesz zrobić tak:

        char tab[sizeof(chaff)];
        char tab_2[sizeof(chaff::dross)];

 

+1 głos
odpowiedź 27 kwietnia 2018 przez Patrycjerz Mędrzec (192,320 p.)
edycja 27 kwietnia 2018 przez Patrycjerz
Kod jest prawie poprawny (choć bezsensowny, ale mniejsza o to). Otóż nie zmieści ci się obiekt struktury chaff w pamięci o rozmiarze 20 charów. Potrzebowałbyś 24-elementową tablicę dla architektury 32-bitowej, a 28 dla 64-bitowej.

PS Jak zauważył słusznie kolega Qwerty96, powinieneś użyć również funkcji strcpy.

Podobne pytania

0 głosów
1 odpowiedź 579 wizyt
0 głosów
0 odpowiedzi 217 wizyt

93,324 zapytań

142,323 odpowiedzi

322,390 komentarzy

62,653 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 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...