• 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

Konkurs Mistrz Programowania
0 głosów
492 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,940 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ź 672 wizyt
0 głosów
0 odpowiedzi 339 wizyt

93,653 zapytań

142,574 odpowiedzi

323,089 komentarzy

63,169 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

Kursy INF.02 i INF.03
...