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

Dynamiczna tablica w C

Object Storage Arubacloud
0 głosów
4,919 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 8,031 wizyt
pytanie zadane 6 stycznia 2017 w C i C++ przez Astenna Początkujący (340 p.)
0 głosów
1 odpowiedź 894 wizyt
pytanie zadane 20 czerwca 2018 w C i C++ przez PgK Obywatel (1,380 p.)
0 głosów
1 odpowiedź 1,011 wizyt

92,572 zapytań

141,422 odpowiedzi

319,644 komentarzy

61,959 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!

...