g++, naruszenie ochrony pamięci -amazing

0

Cześć,
mam intrygujący problem z tablicami. W programie korzystam z kilku tablic jedno i dwuwymiarowych o wymiarach 2^N. Program działa poprawnie dla N<10, powyżej tej wartości pojawia się "Naruszenie ochrony pamięci" przy wywołaniu. Ponieważ przeczytałem, że spowodowane to jest np. odwoływaniem się do pamięci poza zakresem, "zakomentowywałem" kolejno poszczególne części programu, aż do absurdalnej postaci:

#include <iostream>
#include <math.h>

using std::cout;
using std::cin;

//tu wszystko zakomentowane

int main()
{

	float Ham[1024][1024], v[1024][1024], d[1024];
	int Hamil[1024][2];

	//inicjalizacja Hama
	for (int i=0; i<1024; i++)
	{
		for (int j=0; j<1024; j++)
		{
			Ham[i][j]=0;			
		}
	}

/*
wszystko zakomentowane
*/
	
return 0;
} 

Brakuje mi pomysłu, co może być źle. Robiąc dokładnie taki kod w nowym pliku i kompilując, błąd się nie pojawia. Tutaj, odkomentowując dowolny fragment kodu za deklaracjami tablic, pojawia się naruszenie.
Program sprawdzałem na trzech komputerach pod linuksem openSuse i Ubuntu, wszędzie to samo... kompiluję za pomocą g++.

0
        float Ham[1024][1024], v[1024][1024], d[1024];
        int Hamil[1024][2];

Tworzysz na stosie megabajty zmiennych. Stos nie ma po prostu takiej pojemności. Można by go zwiększyć w opcjach linkera, ale to nie jest rozwiązanie.
Tak duże tablice zrób globalne albo po prostu twórz je dynamicznie.

0

Znaczy wstawiłeś nam tutaj dzialajacy kod i mamy zgadywać czemu przestaje działać jak odkomentujesz jakieś fragmenty których nie pokazałeś? o_O
Pytanie kontrolne: jesteś pewien ze stos ma odpowiedni rozmiar? Co prawda alokujesz tu raptem 8MB ale to jednak moze być za dużo.

0
#include <iostream>
#include <cmath> // W C++ używamy cmath a nie math.h
#include <cstring>

using std::cout;
using std::cin;

float Ham[1024][1024], v[1024][1024], d[1024]; // za duże tablice, muszą być globalne
int Hamil[1024][2];

int main()
{
  //inicjalizacja Hama
  memset(Ham, 0, 1024*1024); // trochę krócej i zapewne szybciej

  return 0;
}
0

Dzięki za uwagi, udało się.

1 użytkowników online, w tym zalogowanych: 0, gości: 1