Wczytanie liczby do dynamicznej tablicy

Wczytanie liczby do dynamicznej tablicy
M5
  • Rejestracja:ponad 2 lata
  • Ostatnio:5 dni
  • Postów:32
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?

Kopiuj
#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;
}

edytowany 1x, ostatnio: Riddle
Zobacz pozostałe 2 komentarze
Alley Cat
@jarekr000000: współcześnie też się dostaje
CP
Dokładnie, jakby coś pomaglował po pamięci to by pewnie trafił później na swój używany block mallocka, albo takie pierwotne śmieci, takie co powstają przy włączeniu prądu czyli losowość jaka się ustawia na przerzutnikach, jak to się dziwnie przedstawia są 4 stany: 0/1/?/x, akurat ta jest związana z fizyką, który pierwszy tranzystor się załączy taki bit się ustawi w przerzutniku.
jarekr000000
Można dostać śmieci jak się dostanie pamięć, którą ten sam program uprzednio uwolnił. Ale raczej pierwotnych śmieci czy czegoś po innych programach się nie dostanie w żadnym sensownym systemie - ze względów bezpieczeństwa.
CP
@jarekr000000: kiedyś się zdarzały takie wycieki, że jak kompilator sobie robił paddingi, a zerowanie odbywało się po zmiennych, to te miejsca paddingowane nie były wyzerowane i tam czasem do jakiś wycieków informacji dochodziło co mogło pomóc potem przy eskalacji uprawnień.
Alley Cat
@CloudPro: to jeszcze co innego i też jest nadal aktualne
hauleth
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:9 dni
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.


M5
a może być tak ze zamiast drukować tab[i], powienienem raczej drukować ich adresy, znaczy &tab[i] ?
hauleth
Nie, robisz wszystko zgodnie z zadaniem.
EL
  • Rejestracja:ponad 4 lata
  • Ostatnio:około 16 godzin
  • Postów:138
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.

_13th_Dragon
Obstawiałbym że to skrót myślowy, "nie robisz źle" w sensie "nic niezgodnego z zadaniem". Aczkolwiek owszem takie rzeczy należy sprawdzać.
KS
  • Rejestracja:prawie 4 lata
  • Ostatnio:około 15 godzin
  • Postów:609
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 )

edytowany 3x, ostatnio: ksh
IN
  • Rejestracja:ponad 2 lata
  • Ostatnio:około 2 lata
  • Postów:60
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.

edytowany 1x, ostatnio: infinityhost

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.