-
-
-
Witam,
Czy ktoś może mi wyjaśnić co dokładnie ma robić program z poniższego polecenia?? Bo mam problem ze zinterpretowaniem polecenia
Ćwiczenie wykorzystania wskaźników jako alternatywnej metody dostępu
do zmiennych tworzonych przez kompilator tzn. zmiennych globalnych i lokalnych.
( Patrz przykład z wykładu nr 5 strona nr 3 )
- Utwórz zmienne różnych typu: char, int, long, ...
- Napisz instrukcje zapisu wartości do jednej zmiennej (np. typu long)
za pomocą adresu innej zmiennej (tego samego typu lub innego)
- Kontrolnie wyświetlaj zawartości zmiennych po dokonaniu tych zapisów
Dodatkowo można napisać fragment programu, który wyświetli
zawartości poszczególnych bajtów zajmowanych w pamięci
przez w/w zmienne.
_________________ ----------------------------------------------------------
Szukam dorywczej pracy w weekendy i wieczorami przy nagłośnieniu we Wrocławiu. W klubie w sali koncertowej, w teatrze, przy imprezach plenerowych!!!
d41d8cd98f00b204e9800998ecf8427e
-
-
-
Zadanie faktycznie niezbyt zrozumiałe... Może w tych notatkach z wykładu jest coś co by to rozjaśniło... Jedyne co mi do głowy przychodzi to cos w stylu
#include<stdio.h>
void dumpmem(void *ptr, int nbytes)
{
while(nbytes--) {
int val=*(unsigned char*)ptr;
printf("%d ", val);
ptr++;
}
printf("\n");
}
int main()
{
int i=0x11111111;
printf("%d\n", i);
dumpmem(&i, sizeof(int));
*((char *)&i)=65;
printf("%d\n", i);
dumpmem(&i, sizeof(int));
return 0;
}
d41d8cd98f00b204e9800998ecf8427e
-
-
-
ee a może jednak coś co nie jedzie na bitach??
_________________ ----------------------------------------------------------
Szukam dorywczej pracy w weekendy i wieczorami przy nagłośnieniu we Wrocławiu. W klubie w sali koncertowej, w teatrze, przy imprezach plenerowych!!!
d41d8cd98f00b204e9800998ecf8427e
-
-
-
dziub-dziub napisał/a: | ee a może jednak coś co nie jedzie na bitach?? |
A jest coś co robi komputer co nie jedzie po bitach ?
Tak czy inaczej - podaj namiary na te notatki z wykładu to może uda się zrozumieć co autor miał na myśli pisząc to czego nie napisał
d41d8cd98f00b204e9800998ecf8427e
-
-
-
_________________ ----------------------------------------------------------
Szukam dorywczej pracy w weekendy i wieczorami przy nagłośnieniu we Wrocławiu. W klubie w sali koncertowej, w teatrze, przy imprezach plenerowych!!!
d41d8cd98f00b204e9800998ecf8427e
-
-
-
dziub-dziub napisał/a: | chodzi mi o nie operowanie na bitach kapishi?? (kompilator z komputerem niech sobie operują ja nie chcę tego widzieć )
|
W tym kodzie nie ma żadnego magiczniego operowania na bitach. Może parę mniej oczywoistych rzeczy:
int i=0x11111111;
To nie jest żadna "magiczna" operacja na bitach, tylko zwykłe zainicjowanie wartości zmiennej całkowitej za pomocą stałej w reprezentacji szesnastkowej. Wygodne, bo od razu wiadomo co jest w którym bajcie - w tym przypadku każdy z nich zawiera 0x11, czyli 17. Ale to nieistotne.
int val=*(unsigned char*)ptr;
ptr jest wskaźnikiem na void (żeby można było funkcji przekazać adres zmiennej dowolnego typu). Tu konwertujemy go na wskaźnik do unsigned char, a następnie wyciągamy wartość z tej komórki pamięci i wstawiamy ją do zmiennej val.
*((char *)&i)=65;
To jest najmniej oczywiste. Oszukujemy kompilator i próbujemy mu wmówić, że "i" jest zmienną typu char a nie int.
1. bierzemy adres zmiennej i - &i - jest on typu "int *"
2. konwertujemy go do typu "char *"
3. robimy dereferencję, czyli odwołujemy się do komórki pamięci na którą pokazuje nasz "oszukany" wskaźnik
4. do tej komórki wstawiamy 65
Skutki tego oszustwa widać po uruchomieniu programu.
d41d8cd98f00b204e9800998ecf8427e
Powered by phpBB modified by Przemo © 2003 phpBB Group. Then, after many years modified again, this time by Piotrek © 2014 Strona wygenerowana w 11,5ms. Zapytań do SQL: 17
|