//---- Odkomenuj swoj kompilator -----
#define VISUAL
//#define BORLAND
//------------------------------------
#ifdef BORLAND
#include
#include
#endif
#ifdef VISUAL
#include
#endif
#include
#include
#include
//UWAGA: dla kompilatorow 16 bitowych jak BC31 int ma dlugosc 2 bajtow
//dla kompilatorow 32 bitowych jak MSV6.0 int ma dlugosc 4 bajtow
//ponizsze komentarze przyjmuja dlugosc int == 2 bajty!
//wygodnie definiowac jest strukture jako typedef
//nie trzeba wtedy przed deklaracja uzywac: struct TYPX X;
typedef struct
{
int x;
int y;
} TYPX;
//-------------------------
//unia ma dlugosc tylu bajtow ile najdluzszy jej skladnik
//skladniki unii nakladaja sie na siebie w pamieci zajetej przez unie
typedef union
{
TYPX xy1; //1 skladnik dlugosci sizeof(TYPX) = 4 bajty
unsigned long xy2; //2 skladnik dlugosci sizeof(unsigned long) = 4 bajty
char tab[5]; //3 sklanik 5 bajtow
} TYPXun;
//unia ma dlugosc 5 bajtow
TYPX *ptX;
//wskaznik do struktury TYPX
//rozmiaru 2 (near pointer) lub 4 (far pointer)
//bajtow w zaleznosci od modelu
//pamieci ustawionej w kompilatorze
//na poczatku wskaznik ma wartosc NULL == 0
// pozniej podstawie pod niego adres o obszaru pamieci w ktorej
//bede trzymal strukture.
//UWAGA:
// wszystkie wskazniki niezaleznie od typu danych do jakich wskazuja
// maj taka sama taka sama dlugosc np:
// char *str; - wskaznik do tablicy znakow
// void *xxx; - wskaznik bez typu
// int *yyy; - wskaznik do int'a
// TYPX *ptX; - wskznik do struktury
// TYPXun *ptXun; - wskznik do unii
//------------------------------------------------
void main()
{
TYPX X; //struktura lokalna allokowana na stosie w momencie wywolania fun. main
TYPXun Xun; //unia
//clrscr(); //borland czysc ekran
printf( "\n\n" );
//rozmiar struktury TYPX i wielkosc wskaznika
// sizeof zwraca rozmiar poanego mu typu w bajtach
printf( "sizeof TYPX=%d adrres=%d\n", sizeof(TYPX), sizeof(TYPX*) );
//allokujemy pamiec dla naszej struktury
// calloc zwraca wsk. do zaallokowanej pamieci = calloc( ilosc_blokow, rozmiar_pamieci_wbloku )
if ( (ptX=calloc( 1, sizeof(TYPX) )) == NULL )
{
printf( "ERROR calloc\n");
exit(1);
}
// wypelniam caly obszar pamieci bajt po bajcie zerami (mozna innymi liczbami)
memset( ptX, 0, sizeof(TYPX) );
printf( "1: z->x=%d z->y=%d\n", ptX->x, ptX->y );
ptX->x = 1; //podstawienie za pole x w struct TYPEX przez wskaznik do tej struktury
ptX->y = 2;
printf( "2: z->x=%d z->y=%d\n", ptX->x, ptX->y );
X.x = 4; //podstawienie za pole struktury
X.y = 5;
printf( "1: X.x=%d X.y=%d\n", X.x, X.y );
//kopjujemy bajty pamieci struktury z pod adresu ptX do &X w ilosci sizeof(TYPX)
memcpy( &X, ptX, sizeof(TYPX) );
printf( "2: X.x=%d X.y=%d\n", X.x, X.y );
//-------------------------- jak uzywac unie -------------------------------
//podstawiamy zapole unii xy1 w strukturze TYPX w polu x i y
//po dwa bajty, podane zakami aski
Xun.xy1.x = 'ab'; Xun.xy1.y = '12';
//wyswietla pola unii widziane przez strukture TYPX 2*2 int = 4 bajty
printf( " Xun.xy1.x=%d Xun.xy1.y=%d\n", Xun.xy1.x, Xun.xy1.y );
//wyswietla pola unii widziane przez unsigned long dlugosci 4 bajtow
printf( " Xun.xy2=%ul\n", Xun.xy2 );
printf( " Xun.tab=%.4s\n", Xun.tab );
//%.4s zmusza printf wyswietlic tylko 4 znaki z tablicy
//dlatego tak zrobilem bo tablicy nie zakonczono znakiem 0
//printf by tak dlugo wyswietlal bajty pamieci spod adresu Xun.tab az spotkal by znak 0
//sprobujcie!
//UWAGA wazne!
//zawsze zwolnij po "sobie" pamiec
free( ptX ); //zwalnia pamiec przydzielona pod strukture TYPX
}