NOVINKA: Získej 40 hodin praktických dovedností s AI – ZDARMA ke každému akreditovanému kurzu!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze – Lekce 2 - Dynamická alokace paměti v jazyce C

Zpět

Upozorňujeme, že diskuze pod našimi online kurzy jsou nemoderované a primárně slouží k získávání zpětné vazby pro budoucí vylepšení kurzů. Pro studenty našich rekvalifikačních kurzů nabízíme možnost přímého kontaktu s lektory a studijním referentem pro osobní konzultace a podporu v rámci jejich studia. Toto je exkluzivní služba, která zajišťuje kvalitní a cílenou pomoc v případě jakýchkoli dotazů nebo projektů.

Komentáře
Avatar
Odpovídá na emedla
Pavel Habžanský:6.12.2015 23:12

Nepřetypováváš přímo tu adresu, jenom tím říkáš, co se na tý adrese bude ukládat (v tomto případě int). Takhle bych to dovedl asi nejsnáze vysvětlit

Odpovědět
6.12.2015 23:12
Čím větší výzva, tím větší zkušenost
Avatar
David Novák
Tvůrce
Avatar
Odpovídá na mnauik
David Novák:7.12.2015 10:30

valgrind

Odpovědět
7.12.2015 10:30
Chyba je mezi klávesnicí a židlí.
Avatar
Odpovídá na mnauik
Neaktivní uživatel:7.12.2015 11:17

gcc -d main.c / g++ -d main.cpp
valgrind ./a.out
jak pise David N. Valgrind je nejlepsi varianta..navic kdyz do kompilace pridas prepinac -d bude se ti to kompilovat s debugovacima symbolama ... takze se potom v tom valgrindu podivas cos pokazil...

pripadne jestli chces mi fakt cistej kod kompiluj takhle
gcc -d -Wall -pedantic main.c / g++ -d -Wall -pedantic main.cpp

to ti z kazdyho warningu udela error a rve to na tebe kdyz porusujes standardy .. ;) bav se

Odpovědět
7.12.2015 11:17
Neaktivní uživatelský účet
Avatar
David Novák
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
David Novák:7.12.2015 11:50

Trochu poopravím..

gcc -Wall -Wextra -pedantic // vypíše všechny možné varování
gcc -Wall -Wextra -pedantic -Werror // bere je jako chyby - nutí tě psát validně
gcc -g // přidává debugovací informace

Můžeš prosím tě v krátkosti říct, co dělá -d ? Nechce se mi to studovat a kompilace s tímto přepínačem mi vypíše "no input files". Nakoukl jsem do manuálu a myslím, že to má produkovat výstupy jednotlivých fází překladu. -da vyprodukuje vše.. Docela zajímavý výstup.. Ale myslím, že jsi asi myslel -g :)

Odpovědět
7.12.2015 11:50
Chyba je mezi klávesnicí a židlí.
Avatar
David Novák
Tvůrce
Avatar
Odpovídá na David Novák
David Novák:7.12.2015 11:52

Jo a u toho -pedantic je ještě velmi vhodné uvést konkrétní standard, jinak tě ti to bude nutit výchozí, což bude asi iso 89..

gcc -std=c11 -pedantic // varuje, když použiješ něco, co není v C11 standardu
Odpovědět
7.12.2015 11:52
Chyba je mezi klávesnicí a židlí.
Avatar
Odpovídá na David Novák
Neaktivní uživatel:7.12.2015 12:47

urcite jsem myslel -g :D jen jsem nepremyslel diky za doplneni ...

Odpovědět
7.12.2015 12:47
Neaktivní uživatelský účet
Avatar
Lukáš Hypša:6.1.2018 18:35

Když zadám jako počet intů 9, vypíše se pouze RUN_SUCCESFUL, při 10 se vypíšou i čísla v cyklu, při 11 se vypíše pouze RUN FAILED. Neví někdo?

int pocet = 10; // pro 9, 10 a 11 se program chová odlišně
int *p_cisla = (int *) malloc(sizeof(int) * pocet);
for(int i = 0; i < pocet; i++)
{
*p_cisla = i;
printf("%d ", *p_cisla);
p_cisla++;
}
free(p_cisla);
p_cisla = NULL;
return (EXIT_SUCCESS);

 
Odpovědět
6.1.2018 18:35
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Lukáš Hypša
DarkCoder:6.1.2018 21:51

Vytvořený ukazatel na začátek pole je třeba považovat za konstantu a není dovoleno jej měnit. Pro přístup a výpis prvků dynamického pole ukazuje následující kód:

int pocet = 10;
int *p_cisla = (int *)malloc(sizeof(int) * pocet);
for (int i = 0; i < pocet; i++) {
        *(p_cisla + i) = i;
        printf("%d ", *(p_cisla + i));
}
free(p_cisla);
p_cisla = NULL;
Odpovědět
6.1.2018 21:51
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Odpovídá na DarkCoder
Patrik Pastor:30.8.2019 12:26

prave jsem z prdele vyzkousel:

#include <stdio.h>
 1 #include <stdlib.h>
 2
 3 int main (void) {
 4
 5    int *pi;
 6     for(int i =0; i<999999999999 ; i++)
 7        pi = (int*) malloc(sizeof(int)*100);
 8
 9       printf("sem tu\n");
10
11    return 0;
12 }
13
  • pocitac se mi zaseknul ze vubec nereagoval, tak sem ho manualne restartoval, pri nabootovani se to cele procistilo a uz v cajku, ale ale to celkem prdel toto delat, kdyz vim ze OS se postara, aby se vse vycistilo :D
Editováno 30.8.2019 12:27
 
Odpovědět
30.8.2019 12:26
Avatar
Odpovídá na DarkCoder
Patrik Pastor:30.8.2019 12:32

ale vubec to neni tak jak @David_Capka napsal :

Nejhorší situace je, když paměť zapomeneme uvolnit v nějakém cyklu. Paměť nám při této chybě samozřejmě za nějakou dobu dojde, aplikace spadne a uživatel přijde o data a zaplatí raději konkurenci, aby mu prodala funkční aplikaci

Nic takoveho se nestalo, pamet sice dosla, ale ja jsem o zadne data neprisel a operacni system se o vse postaral. Chyba se tedy muze stat (neumyslne), ale pochybuji, ze by nekdo kvuli tomu se za konkurenci, aby mu prodala funkcni aplikaci - to mi prijde smesne.

 
Odpovědět
30.8.2019 12:32
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 29.