dynamiczna alokacja pamięci

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ć? ://

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ć ?
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.

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.

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

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

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