dynamiczna alokacja pamięci

Odpowiedz Nowy wątek
2019-06-05 21:38

Rejestracja: 1 rok temu

Ostatnio: 10 miesięcy temu

0

Zaalokuj pamięć dla liczby typu float. Do zaalokowanej pamięci zapisz liczbe pi. Wyświetl wartość tej pamięci (zaalokowanej zmiennej) oraz jej adres.

Oto mój kod:

int main() {
    float *tab;
    float pi = 3.141593;

    tab = (float*)malloc(pi * sizeof(float));

    if(tab == NULL){
        printf("Failed to allocate memory");
        exit(8);
    }

    printf("%f %f", pi, &pi);

    free(tab);
    return 0;
}

Program powinien wyświetlić: 3.141593 0x2137010. Co należy poprawić? ://

Pozostało 580 znaków

2019-06-05 21:48

Rejestracja: 1 rok temu

Ostatnio: 2 dni temu

0
  1. malloc(pi*sizeof(...)) nie ma za bardzo sensu (ale też nie szkodzi specjalnie) - alokujesz tak pamięć na 3 liczby float zamiast na jedną.
  2. Nie wstawiasz liczby pi do pamięci wskazywanej przez "tab"
  3. co dokumentacja printf-a pisze o wyświetalniu wartości wskaźnika ? Jakiego ciągu formatującego należy użyć ?
edytowany 2x, ostatnio: Bartłomiej Golenko, 2019-06-05 22:08

Pozostało 580 znaków

2019-06-05 22:10

Rejestracja: 3 lata temu

Ostatnio: 5 godzin temu

0
#include <stdio.h>
#include <stdlib.h>

int main () {
    float pi = 3.141593;
    float * t = (float*)malloc(sizeof(float));
    *t = pi;
    printf("%f, %p\n", *t, &t);
    return 0;
}

C99 standart.


edytowany 1x, ostatnio: lion137, 2019-06-05 22:15
Pokaż pozostałe 2 komentarze
&t wyświetla adres wskaźnika a nie adres na który wskazuje - tajny_agent 2019-06-05 23:51
A co to za różnica? - lion137 2019-06-05 23:55
Taka sama jak między adresem zmiennej a przechowywaną przez nią wartością. Czyli dość spora ;) - tajny_agent 2019-06-06 00:00
Czyli co w końcu jest tym adresem? - lion137 2019-06-06 18:15

Pozostało 580 znaków

2019-06-06 12:11

Rejestracja: 5 lat temu

Ostatnio: 1 godzina temu

2

Po kolei:
1. Deklaracja zmiennych jest prawie OK. Dobrą praktyką jest nadawanie zmiennym wartości w chwili deklaracji. Nie robisz tego dla tab. Możesz zmienić to w jedną linijkę.

2. Alokacja pamięci powinna określać typ wartości jakie będą przechowywane oraz rozmiar tej pamięci. Jeśli gdzieś na necie widzisz zapis n * sizeof( typ ), to oznacza, że ktoś tworzy tablicę, o rozmiarze n. Ty chcesz jedną wartość, zrób więc to, co kolega @lion137 w funkcji malloc.

3. Piszesz, że:

Program powinien wyświetlić: 3.141593 0x2137010

skąd taka pewność co do adresu zmiennej pi? Nie masz żadnej gwarancji i żadnej pewności gdzie zostanie ona utworzona tym bardziej, że dajesz ją na stos.
Po drugie, jeśli chcesz wyświetlić wartość w formacie heksadecymalnym, to używasz %x lub %p

4. Jeśli chcesz wyświetlić adres zmiennej zaalokowanej czyli w Twoim przypadku tab, to nie rób tego tak, jak pokazał @lion137, ale zrób to bez znacznika &.
Czyli:

printf("%f, %p\n", *t, t);

Rzecz w tym, że wskaźnik (a dokładnie jego wartość) już jest adresem zmiennej, na który wskazuje. Więc nie musimy pobierać jeszcze jego adresu.

Pozostało 580 znaków

2019-06-06 18:10

Rejestracja: 13 lat temu

Ostatnio: 5 miesięcy temu

0
#include <iostream>
#include <memory>
#include <cmath>

int main()
{
    auto f = std::make_unique<float>(M_PI);
    std::cout << *f << " " << f.get();
    return 0;
}

#include<hacking.h>
char *a=schakuj_pentagon("pobierz_baze_danych"); //<-odkrywczy kod;

Pozostało 580 znaków

Odpowiedz

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