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

Dynamiczna tablica w C

0 głosów
6,541 wizyt
pytanie zadane 26 kwietnia 2018 w C i C++ przez Agnes Użytkownik (990 p.)
int *m = (int*)malloc(6 * sizeof(int));

Jak wypełnić taką tablicę? W każdym przypadku, w którym próbuję to zrobić dostaję komunikat o tym, że inicjalizuję zbyt wiele wartości, przy czym każda liczba wartości większa niż jeden jest dla kompilatora zbyt duża - jakby nie widział, że chodzi mi o zainicjalizowanie tablicy, nie pojedynczej zmiennej.

komentarz 26 kwietnia 2018 przez draghan VIP (106,230 p.)
A w jaki sposób to robiłeś? :)
komentarz 26 kwietnia 2018 przez Qwerty96 Stary wyjadacz (13,580 p.)
Jeśli chcesz mieć tablicę 6 intów, to czemu w ogóle alokować tą tablicę dynamicznie przez malloca?
komentarz 26 kwietnia 2018 przez Agnes Użytkownik (990 p.)

@draghan,
 W taki:

*m = { 1, 2, 3, 4, 5, 6 };

 

komentarz 26 kwietnia 2018 przez Agnes Użytkownik (990 p.)

@Qwerty96,

Taka jest treść zadania, które mam wykonać. Też uważam, że wystarczy tu statyczna alokacja, ale nic nie poradzę.

komentarz 26 kwietnia 2018 przez Qwerty96 Stary wyjadacz (13,580 p.)
m jest wskaźnikiem, nie tablicą. W taki sposób nie zainicjalizujesz tego. Po prostu w pętli nadaj te wartości.

2 odpowiedzi

0 głosów
odpowiedź 26 kwietnia 2018 przez Eryk Andrzejewski Mędrzec (164,260 p.)
edycja 26 kwietnia 2018 przez Eryk Andrzejewski

Myślę, że dobrym rozwiązaniem będzie użycie funkcji memset()

http://en.cppreference.com/w/c/string/byte/memset

Taki szybki przykład na bazie Twojego kodu (przykład pewnie trochę głupi, ale to nie ma chyba większego znaczenia).

char *str = (char*)malloc(6 * sizeof(char));
memset(str, 'A', 5);
str[5] = '\0';

printf("%s", str);

free(str);

Alokujemy sobie dynamicznie 6 elementów typu char. Pięć z nich wypełniamy literką A, natomiast ostatni to znak null (koniec łańcucha znaków). I teraz możemy sobie wypisać wygenerowany przez nas tekst. smiley

@EDIT

Chociaż teraz widzę, że chyba chodzi Ci o inicjalizację wartościami różnymi.

0 głosów
odpowiedź 26 kwietnia 2018 przez draghan VIP (106,230 p.)

W C nie można ot tak przypisać zbioru wartości do tablicy. W Twoim przypadku, tablica ta jest tak naprawdę wskaźnikiem. A przypisać zbiór wartości do wskaźnika... Nie da rady. :)

Dla tablicy dynamicznej musisz to zrobić element po elemencie:

int i;
for(i = 0; i < 6; ++i)
{
    m[i] = i + 1;
}

Można używać również funkcji z biblioteki standardowej, jak memset() czy memcpy() jednak dla Twojego przypadku zupełnie w porządku będzie pętla. :)

komentarz 26 kwietnia 2018 przez Agnes Użytkownik (990 p.)
Czy to wyglądałoby tak samo w przypadku tablicy statycznej?

A co w przypadku tablicy charów, która ma przedstawiać konkretny napis, gdzie kodom ASCII każdego znaku nie da się przypisać jakiegoś konkretnego znaku (wątpię, żeby np. 5 co czwartych w kolejności znaków w ASCII tworzyło konkretne słowo)? Wtedy jedynym rozwiązaniem jest inicjalizacja znaku dla każdej komórki tablicy?
komentarz 27 kwietnia 2018 przez draghan VIP (106,230 p.)

Czy to wyglądałoby tak samo w przypadku tablicy statycznej?

Nie. Można w C zainicjalizować tablicę statyczną przez inicjalizację zbiorczą:

int tab[] = {1, 3, 5, 67}; // inicjalizacja
for(int i = 0; i < sizeof(tab) / sizeof(tab[0]); ++i)
{
    printf("%d ", tab[i]);
}

Tak samo można to zrobić z tablicą znakową:

char string[15] = {'k', 'o', 't', 'm', 'a', 'a', 'l', 'e'};

Jednak typ znakowy zawsze miał szczególne względy, z powodu swojego przeznaczenia. Stąd mamy możliwość nieco wygodniejszej inicjalizacji takiej tablicy:

char string[15] = "kotmaale"; 

No i nie należy zapominać, że to jest tylko inicjalizacja. "Normalne" przypisania zbioru wartości do tablicy nie działają. :)

char string[15] = "kotmaale"; // inicjalizacja
printf(string);
// string = "alamakota"; // błąd, już nie inicjalizacja! 
strcpy(string, "alamakota"); 
printf(string);

 

Podobne pytania

0 głosów
2 odpowiedzi 9,195 wizyt
pytanie zadane 6 stycznia 2017 w C i C++ przez Astenna Początkujący (340 p.)
0 głosów
1 odpowiedź 1,304 wizyt
pytanie zadane 20 czerwca 2018 w C i C++ przez PgK Obywatel (1,380 p.)
0 głosów
1 odpowiedź 1,734 wizyt

93,772 zapytań

142,730 odpowiedzi

323,382 komentarzy

63,369 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...