Stack Overfloaw v cyklu – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Stack Overfloaw v cyklu – C / C++ – Fórum – Programujte.comStack Overfloaw v cyklu – C / C++ – Fórum – Programujte.com

 

_Radek_
~ Anonymní uživatel
88 příspěvků
10. 6. 2011   #1
-
0
-

Zdravím,
právě čtu jednu knihu a narazil jsem na příklad kódu v souvislosti s přístupem do paměti. No a tak jsem se to rozhodl všelijak vyzkoušet a mám následující kód:



#include <iostream>
#define M 512

int main()
{
int i, j;
int pole[M][M];

for( i=0; i<M; ++i )
for( j=0; j<M; ++j )
pole[j][i] = 25;

system("pause");
return 0;
}


Zkompiloval jsem to ve Visual C++ 2010 a po spuštění mi debbuger hlásí chybu Stack Overflow - zakázaný přístup do paměti. Následně mě to vyhodí nějaký kód v assembleru. Tento problém hlásí pokud je M větší než cca 500.
Pokud ale přehodím indexi v přístupu k poli na: pole[i][j], vše je v pořádku.

Nemohl by někdo chytřejší trochu osvětlit co se děje v pozadí ? :smile11: Protože normálně bych čekal, že na pořadí indexů nezáleží.

Díky za jakoukoliv odpověď :smile1:

Nahlásit jako SPAM
IP: 91.187.60.–
KIIV
~ Moderátor
+43
God of flame
10. 6. 2011   #2
-
0
-

na poradi indexu by taky zalezet nemelo...
preteceni zasobniku se tyka hlavne statickych dat - tj. to pole je proste prilis velke...
nicmene by mohlo byt na case seznamit se s dynamickou alokaci pameti - zabrat pamet az za behu - tady jses uz pak omezen pouze systemem (na 32b je to teoreticke maximum 4GB - pouzita)

Nahlásit jako SPAM
IP: 212.136.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
_Radek_
~ Anonymní uživatel
88 příspěvků
10. 6. 2011   #3
-
0
-

Jasně, to mě také napadlo. Ale jaký je tedy limit velikosti pole pro staticky deklarované pole ?
A proč mi to v příkladu výše pracuje správně jen s tím jedním pořadím indexů ??

Nahlásit jako SPAM
IP: 91.187.60.–
KIIV
~ Moderátor
+43
God of flame
10. 6. 2011   #4
-
0
-

To _Radek_ : hadam ze to bude kolem toho megabajtu (mimochodem na linuxu mi to jde at uz tam mam indexy jakykoliv a to i pro 64b i pro 32b kompilaci)

Nahlásit jako SPAM
IP: 212.136.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
_Radek_
~ Anonymní uživatel
88 příspěvků
10. 6. 2011   #5
-
0
-

Aha no jasně, už jsem to taky našel :-D, je to ta velikost Stacku, který je ve Visual C++ defaultně nastaven na 1 MB.

Ale pokud použiju pole[i][j], můžu mít M až 23170 (což je poté až 2 GB jestli se nepletu) a program se spustí normálně. Takže tam asi vzhledem k provádění kódu na pořadí indexu záleží... :smile13:

Ale dík, i tak je mi to trochu jasnější

Nahlásit jako SPAM
IP: 91.187.60.–
KIIV
~ Moderátor
+43
God of flame
10. 6. 2011   #6
-
0
-

To _Radek_ : staticky pole asi ne... muzes nastavit velikost pro stack, ale velky pole jedine dynamicky

Nahlásit jako SPAM
IP: 212.136.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 134 hostů

Podobná vlákna

Stack — založil Qwerty

Stack — založil Robo

C++ / stack / heap — založil frank

C++ Stack implementation — založil Stamp

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý