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

Język C - bloki pamięci

Object Storage Arubacloud
0 głosów
366 wizyt
pytanie zadane 11 grudnia 2017 w C i C++ przez k3ybo4rd Obywatel (1,180 p.)

Mamy sobie funkcję 

void * memcpy (void * restrict s1, const * restric s2, size_t n);

Funkcja kopiuje n bajtów z miejsca s2 w miejsce s1  ( i teraz) - jeśli miejsca zachodzą na siebie, zachowanie funkcji jest niezdefiniowane.

No dobra ale o co chodzi z tym że miejsca zachodzą na siebie?

Jak to wygląda że bloki pamięci mogą na siebie zachodzić?

W jaki sposób można popełnić taki błąd że bloki pamięci będą na siebie zachodzić?

2 odpowiedzi

+1 głos
odpowiedź 11 grudnia 2017 przez Bondrusiek Maniak (61,370 p.)

Witam,

stworzyłem taki kod gdzie adresy na siebie nachodzą.

#include <stdio.h>
#include <string.h>
int main()
{
    char myname[] = "Hello World!";
    memcpy ( myname, myname, strlen(myname)+1 );
    printf("%s\n", myname);
    return 0;
}

Nie wiem czy oto Ci chodzi ale ten kod się kompiluje i działa. Musisz podać dokładniejszy opis problemu bo nie wiem czo o to chodziło.

+1 głos
odpowiedź 11 grudnia 2017 przez mokrowski Mędrzec (155,460 p.)

W funkcji masz podany wskaźniki i wielkość bloku. Każdy ze wskaźników ma modyfikator restrict. To oznacza że nigdy nie dojdzie do sytuacji by na miejsce w pamięci na które wskazuje wskaźnik, wskazywał inny wskaźnik aktywny w tej funkcji. W przeciwnym wypadku będzie UB (zachowanie niezdefiniowane). Niezdefiniowane - oznacza że może się nic nie stać, może program "się wywrócić", może dojść do zniszczenia danych na dysku... cokolwiek....

Teraz pomyśl o tym że standard dopuszcza w strcpy() kopiowanie "od przodu" (czyli od najmniejszych adresów) lub "od tyłu" (czyli od największych adresów. Wybór zależy od specyfiki platformy lub twórców kompilatora. Ogólnie wybierają to co będzie szybsze na danej platformie. Co się stanie w takim przypadku gdy będzie zachowana taka wolność wyboru? Dane zostaną skopiowane poprawnie? Rozważ obydwa przypadki a zobaczysz jakie są niebezpieczeństwa.

Jeśli nie masz pewności że dane się nie nakładają/zazębiają/wskazują na to samo miejsce, stosuj memmove().

Podobne pytania

0 głosów
0 odpowiedzi 867 wizyt
+1 głos
0 odpowiedzi 198 wizyt
0 głosów
3 odpowiedzi 1,319 wizyt

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

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

...