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

Działanie kompilatora języka C

Object Storage Arubacloud
0 głosów
446 wizyt
pytanie zadane 24 lutego 2019 w C i C++ przez Moti Użytkownik (650 p.)

Witam mam następujące pytanie: "Czy kompilator języka C może umieścić zmienną typu struct A pod adresem0x7ffc9e54cb12?".

Typ:

struct A {
    int8_t  a;
    int32_t b;
};
 

Dostałem takie pytanie na zajęciach, bardzo proszę o udzielenie na nie odpowiedzi? Ja niestety nie umiem.

2 odpowiedzi

+2 głosów
odpowiedź 25 lutego 2019 przez mokrowski Mędrzec (156,100 p.)
wybrane 25 lutego 2019 przez Moti
 
Najlepsza

Krótka odpowiedź na to pytanie brzmi: oczywiście że tak.

Oto dowód :)

#include <stdio.h>
#include <stdint.h>

struct A {
    int8_t a;
    int32_t b;
};

int main(void) {
    volatile struct A * const ptrA = (void *)0x7ffc9e54cb12;
    printf("Adres ptrA to: %p\n", (void *)ptrA);
    return 0;
}

Nieco bardziej rozbudowana (i dokładniejsza odpowiedź) to sięgnięcie do standardu i przeczytanie że próba dostępu do adresu który nie należy do procesu/programu, kończy się zachowaniem niezdefiniowanym.

A możliwe powody to np:

1. Brak tego adresu w pamięci platformy sprzętowej - platformy systemowe mogą mieć luki w adresowaniu. Przypadek zachodzi dla programowania bez systemu operacyjnego, bezpośrednio na sprzęcie.

2. Brak tego adresu w pamięci procesu - proces nie ma przydzielonej przestrzeni pamięci z tym adresem. Przypadek dla systemów z zarządzaniem pamięcią.

3. Adres jest w pamięci zachowującej się inaczej niż "zwykły RAM" - to mogą być przestrzenie atomowej zmiany bitów (np. ARM), przestrzenie I/O, jakieś inne peryferia...

4. Adres jest niewyrównany - platforma może nie adresować poprawnie adresów wyrównanych do nietypowych dla niej wartości. To może np. spowodować błąd platformy.

5. Adresowanie platformy jest nietypowe - przypadki zachodzą dla np. platform DSP.

6. Struktura danych ma nieprawidłowe wyrównanie - dostęp do pól może nie być realizowany z pożądanym offsetem. Tu prosty przykład dla x86:

#include <stdio.h>
#include <stdint.h>

struct A {
    int8_t a;
    int32_t b;
};

int main(void) {
    struct A a;
    printf("Adresy składników struktury A:\n a = %p\n b = %p\n",
        (void *)&a.a, (void *)&a.b);
    printf("Wielkości pól struktury A:\n sizeof(a) = %zu\n sizeof(b) = %zu\n",
        sizeof(a.a), sizeof(a.b));
    printf("Wielkość struktury A:\n sizeof(struct A) = %zu\n", sizeof(struct A));
    return 0;
}

Wynik (u Ciebie mogą być inne adresy):

Adresy składników struktury A:
 a = 0x7ffe2c749b40
 b = 0x7ffe2c749b44
Wielkości pól struktury A:
 sizeof(a) = 1
 sizeof(b) = 4
Wielkość struktury A:
 sizeof(struct A) = 8

Jak popatrzysz uważnie, suma wielkości pól nie równa się wielkości struktury. Także adresy elementów struktury, różnią się od siebie "nie o ich wielkość".

7. Inne (egzotyczne) powody dla danej platformy - np. obecność rejestrów CPU pod danym adresem :)

+1 głos
odpowiedź 24 lutego 2019 przez adrian17 Ekspert (345,160 p.)
Strzelam, że...

Hint: przeczytaj o wyrównaniu (alignment). Z tego już można bardzo łatwo wywnioskować, czy to jest dobry adres czy czy nie.
komentarz 24 lutego 2019 przez Moti Użytkownik (650 p.)
Dzięki, jestem zielony w tych niskopoziomowych sprawach i nie wiedziałem nawet, gdzie szukać odpowiedzi.

Podobne pytania

+1 głos
2 odpowiedzi 188 wizyt
pytanie zadane 25 czerwca 2018 w C i C++ przez four Użytkownik (720 p.)
0 głosów
1 odpowiedź 701 wizyt
pytanie zadane 16 stycznia 2021 w C i C++ przez Bandyta Początkujący (270 p.)

92,633 zapytań

141,503 odpowiedzi

319,883 komentarzy

62,015 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!

...