• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

<C> Jak najefektywniej 'wyczyścić' tablicę?

Object Storage Arubacloud
+4 głosów
3,749 wizyt
pytanie zadane 8 kwietnia 2015 w C i C++ przez niezalogowany
Zaznajamiam się ze wskaźnikami i próbowałem po wypełnieniu i wydrukowaniu uwolnić tablicę(czy ona nie jest wskaźnikiem?) by móć do niej wpisywać raz jeszcze. Czy można tak wgl. zrobić? Dlaczego po wpisywaniu losowych liczb najpierw wyświetla się 0 0 0, potem 1 1 1, a potem 2 2 2, itd?

#include <stdio.h>

int main(){
    int j, i, tab[3];
    for(i =0; i < 3; i++){
            for(j = 0; j < 3; j++){
                scanf("%i", &tab[j]);
            }
             for(j = 0; j < 3; j++){
                printf("%i ", tab[3]);
            }
            printf("\n");
            free(tab[3]);
    }

     return 0;
}

 

Dziękuje za odpowiedzi

5 odpowiedzi

+1 głos
odpowiedź 8 kwietnia 2015 przez bossik21 Mądrala (5,750 p.)
wybrane 8 kwietnia 2015
 
Najlepsza
for(j = 0; j < 3; j++){
                printf("%i ", tab[3]);

 

Wypisujesz cały czas 3cią komórkę tablicy.

 

Poza tym, nie wiem po co chcesz czyścić w taki sposób jedną komórkę.

Mozesz to zrobić dynamicznie, albo po prostu nadpisać daną komórkę w tablicy, albo wypełnić ją jakimiś wartościami
komentarz 8 kwietnia 2015 przez niezalogowany
O faktycznie. Czuje się głupio teraz. Ale czy ten element z free(tab[3]) to jest dobrze?
komentarz 8 kwietnia 2015 przez bossik21 Mądrala (5,750 p.)
Nie wydaje mi się, aby takie wywołanie  jak daleś miało sens.

Zwalnianie tylko jednej komórki z tablicy? Wyczywam bardzo duże prawdopodobieństwo wyjścia za zakres tablicy.
komentarz 8 kwietnia 2015 przez daan Pasjonat (17,640 p.)

masz racje :) tab[3] odnosi się do 4 elementu tablicy, która ma zadeklarowane tylko 3 miejsca - typowa pomyłka, off by one wink

+2 głosów
odpowiedź 8 kwietnia 2015 przez krecik1334 Maniak (58,390 p.)

Zrób np tak:

int *tab; //pointer
tab = new int[rozmiar]
delete[] tab;
//znowu mozesz uzywac pointera tab i robic z niego tablice

 

 

komentarz 8 kwietnia 2015 przez iwan9449 Pasjonat (20,810 p.)

Kolega pisze w C, tam niestety nie alokuje się pamięcie poprzez new i nie zwalnia się jej poprez delete :)

w C wygląda to np. tak:

int *tab=malloc(rozmiar*sizeof(int));
free(tab);

Pozdrawiam :)

komentarz 9 kwietnia 2015 przez krecik1334 Maniak (58,390 p.)
Ok, dzięki, sam nie wiedziałem, że w C robi się to inaczej niż w C++
+1 głos
odpowiedź 8 kwietnia 2015 przez jegor377 Stary wyjadacz (13,230 p.)
dynamiczność :)
+1 głos
odpowiedź 8 kwietnia 2015 przez daan Pasjonat (17,640 p.)
przywrócone 8 kwietnia 2015 przez daan
Nie widze tutaj nigdzie dynamicznej alokacji pamięci dla tej tablicy, więc nie powinieneś używać free , zwalać pamieć musisz tylko jeżeli sam ją alokowałeś za pomocą malloc lub new. :) Aby ją wyczyścić po prostu wpisz do niej zera, możesz do tego użyć np. funkcji memset :P
0 głosów
odpowiedź 8 kwietnia 2015 przez iwan9449 Pasjonat (20,810 p.)
Tablicę zwalniasz tylko i wyłącznie jeżeli sam ją wcześnie dynamicznie zaalokowałeś (poprzez malloc/calloc czy jak kolwiek :)). Z tego co napisałeś chesz użyć tablicy ponownie, żeby to zrobić wcale nie musisz jej zwalniać, możesz po prostu nadpisać istniejące już w niej wartości :)

Tablica nie jest wskaźniekiem, to jej nazwa jest wkaźnikiem do jej zerowego elementu :)

Z tego co pamiętam kod formatujący typ int to %d, a nie %i :)

Podobne pytania

0 głosów
3 odpowiedzi 403 wizyt
pytanie zadane 13 lutego 2017 w HTML i CSS przez remo82 Użytkownik (560 p.)
+1 głos
2 odpowiedzi 951 wizyt
+1 głos
1 odpowiedź 237 wizyt

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...