Wczytanie liczby do dynamicznej tablicy

0

Mam zrobić coś takiego:

Zadeklaruj tablicę dynamiczną typu int.
(tablica dynamiczna typu int = wskaźnik na typ int*)
Z klawiatury wczytaj liczbę całkowitą.
Ustaw rozmiar tablicy (liczbę jej elementów) na tą wartość. Wykorzystaj funkcję malloc().
Zrób zabezpieczenie, sprawdzające poprawność przydziału pamięci. Wydrukuj tablicę na ekranie (powinny być „śmieci z pamięci”). Usuń tablicę z pamięci.
Wyzeruj wskaźnik.

napisałem taki kod, ale drukuje same 0, a nie te 'śmieci z pamięci'. co jest nie tak?

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

void Zadanie1()
{
    int *tab;
    int x;
    printf("Podaj liczbe calkowita:\n");
    scanf("%d", &x);
    tab = malloc(x * sizeof(int) );
    if(tab == NULL)
    {
        printf("Rezerwacja pamieci nie powiodla sie\n");
    }
    else 
    {
        for(int i = 0; i<x; i++)
        {
            printf("%d ", tab[i]);
        }
    }
    free(tab);
    tab = NULL;
    putchar('\n');
}

int main()
{
    printf("Zadanie 1:\n");
    Zadanie1();

    return 0;
}

2

Nic nie robisz źle. Po prostu malloc nie ma gwarancji, że tam będą śmieci i jak najbardziej mogą być same zera, zwłaszcza jeśli budujesz program w trybie debug czy pokrewnym.

1
hauleth napisał(a):

Nic nie robisz źle.

To nie jest prawda. Na blisko 100% if(tab == NULL) pojawilo sie wylacznie dlatego ze bylo w tresci zadania. A ze w tresci nie jest napisane Zrób zabezpieczenie, sprawdzające ze uzytkownik na wejsciu nie podal np. "osiem" to kod poprawny nie jest, tyle ze w innym miejscu.

0

Zazwyczaj jak rezerwacja pamięci się nie powiodła to kończysz program ;-)
Szczęśliwie NULL idzie do tab u Ciebie na błędzie, więc na free się nie wywalisz.
czasem warto robić int *tab = NULL;

Sensowniej byłoby aby zadanie zwracało np. int
Zależnie czy błąd czy ok. I w main podejmujesz decyzję co dalej.
Choć do tak maleńkiego zadania wypadałoby napisać wszystko w mainie ;-)

Ponad to.
W Twoim przypadku sensowniej jest tak:
tab = malloc( x * sizeof *tab );

Bo powiedzmy, że zapragniesz zmienić typ tab na większy od int.
I nagle coś będzie nie halo. ( W printf kompiler pewnie podpowie ale w tym nie )

0

Nie byłoby źle jakbyś wyświetlał przed zawartością danych 4 bajtów ich adres, powiem więcej, mógłbyś napisać dodatkowe 2 funkcje, 1 - wczytującą liczbę do tablicy i 2 - wyświetlającą adresy zmiennych w tab[] i drukującą ich zawartość(wszystko w pętli). Na koniec mógłbyś dodać funkcję która pyta w jakiej postaci odczytać zawartość danych 4 bajtów (bo deklarujesz tablicę typu int) , dodać wyświetlanie w postaci binarnej zawartości ,w postaci bajtów (czyli znaków). No ciekawostek jest sporo do zrobienia.

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