Wczytanie liczby do dynamicznej tablicy

Wczytanie liczby do dynamicznej tablicy
M5
  • Rejestracja:ponad 2 lata
  • Ostatnio:około miesiąc
  • 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
CP
System operacyjny zwraca czyste strony pamięci, jakby zwrócił z danymi mogło by dojść do wycieku, haseł z innych aplikacji, z kernela, a twoja aplikacja jeszcze nie zdążyła zanieczyścić strony.
jarekr000000
Pewnie wykładowca nie ogarnął 40 lat postępu technicznego. Na 8/16bitowcach takie śmieci można było dostać.
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:17 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:minuta
  • 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 2 godziny
  • Postów:590
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
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)