Zagadnienia z programowania niskopoziomowego w C.

0
  1. Ile bajtów będzie miał wyciek pamięci w tym kodzie ?
char* funkcja(char* p1, char* p2)
{
    char *ptr1, *ptr2;
    ptr1 = malloc(5);
    ptr2 = malloc(10);
    return ptr1;
}
int main()
{
    char *w1, *w2;
    w1 = malloc(1);
    w2 = malloc(3);
    funkcja(w1, w2);
    free(w1);
    free(w2);
}

Według mnie 15 bajtów. Jeżeli się mylę to proszę o wyjaśnienie ile powinno być i dlaczego tyle.

  1. Zadanie w załączniku. Jeżeli mogę prosić o podanie odpowiedzi i wyjaśnienie jak do tego dojść (nikt na całym roku nie jest pewny na 100% jak zrobić to zadanie dlatego umieszczam to tutaj).

  2. Zadanie w załączniku. Odpowiedzi to:
    -grubokońcówkowe

printf("%d", u.i)	1107296256	     
printf("%d", u.s)	16896	             
printf("%s", u.a)	B	                     

-cienkokońcówkowe

printf("%d", u.i)        66
printf("%d", u.s)       66
printf("%s", u.a)       B

Mogę prosić o wytłumaczenie jak do tego dojść ?

3
  1. wygląda dobrze (zakładając, że malloc(5) alokuje 5 bajtów, a nie np. 8-bajtowy blok, co jest możliwe)

  2. poproście prowadzącego, aby używał normalnych słów, jak biały człowiek. Zgaduję, że cieńko- i grubokońcówkowe mają być odpowiednikami little- i big-endian, ale które którego nie zamierzam zgadywać.

Dla 1-bajtowego char to bez różnicy, więc wartość to 7 w obu przypadkach

2-bajtowy short ma bajty (od niższego adresu) 0x05 0x06
little endian - 0x605 = 1541
big endian - 0x506 = 1286

4-bajtowy int ma bajty 0x01 0x02 0x03 0x04
czyli little endian to 0x04030201 = 67305985
a big endian to 0x01020304 = 16909060

  1. zadanie jest niepoprawnie sformułowane. Jest podpowiedź o zakresach wartości liter w ASCII, ale nie ma nigdzie informacji, że ASCII jest używane. Ponadto nie wiadomo w jakim systemie liczbowym zapisane jest 66.

Jeśli base 10:
Można przewrotnie odpowiedzieć, że w EBCDIC wartość 66 nie ma reprezentacji znakowej.

A zakładając ASCII:
big endian:
jako int kolejne bajty to 0x42 0x00 0x00 0x00, czyli 0x42000000, czyli 1107296256
jako short kolejne bajty to 0x42 0x00 czyli 0x4200 czyli 16896
jako char* kolejne bajty to 0x42 0x00 0x00 0x00, wypisane zostanie "B" (zakładając ASCII, chociaż zadanie w żaden sposób o takim założeniu nie mówi)

little endian:
jako int kolejne bajty to 0x42 0x00 0x00 0x00, czyli 0x42 , czyli 66
jako short kolejne bajty to 0x42 0x00 czyli 0x42 czyli 66
jako char* kolejne bajty to 0x42 0x00 0x00 0x00, wypisane zostanie "B" (zakładając ASCII, chociaż zadanie w żaden sposób o takim założeniu nie mówi)

Jeśli base 16:
Można przewrotnie odpowiedzieć, że w EBCDIC wartość 66 nie ma reprezentacji znakowej.

A zakładając ASCII:
big endian:
jako int kolejne bajty to 0x66 0x00 0x00 0x00, czyli 0x66000000, czyli 1711276032
jako short kolejne bajty to 0x66 0x00 czyli 0x6600 czyli 26112
jako char* kolejne bajty to 0x66 0x00 0x00 0x00, wypisane zostanie "f" (zakładając ASCII, chociaż zadanie w żaden sposób o takim założeniu nie mówi)

little endian:
jako int kolejne bajty to 0x66 0x00 0x00 0x00, czyli 0x66, czyli 102
jako short kolejne bajty to 0x66 0x00 czyli 0x66 czyli 102
jako char* kolejne bajty to 0x66 0x00 0x00 0x00, wypisane zostanie "f" (zakładając ASCII, chociaż zadanie w żaden sposób o takim założeniu nie mówi)

2

Dzięki to jest bardzo pomocne. Mam jeszcze tylko pytanie jak z tego 0x605 wyszło Ci to 1541 ? Jak to obliczasz ?(Odpowiedź do zad 2)

To jest zapis o podstawie 16, więc każda kolejna cyfra znacząca to kolejna potęga podstawy

123 to 1 · 102 + 2 · 101 + 3 · 100
a dla podstawy 16
0x605 to 6 · 162 + 0 · 161 + 5 · 162

Możesz sobie to zamienić w kalkulatorze windows.

1 użytkowników online, w tym zalogowanych: 0, gości: 1