• 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

Object Storage Arubacloud
0 głosów
191 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 (155,460 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ź 500 wizyt
0 głosów
0 odpowiedzi 161 wizyt

92,572 zapytań

141,423 odpowiedzi

319,645 komentarzy

61,959 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!

...