Prymitywny kod wywołujący przepełnienie bufora

0

Witam,

Jestem w trakcie pisania kodu, w którym napotkałem na problem związany z buforem.
Fragment kodu, który go generuje jest następujący:

int j, z;
int J = 40,
int Z = 20;

double pp1[ Z ][ J ];

for( z = 1; z <= Z; z = z + 1 )
{
    for( j = 1; j <= J; j = j + 1 )
    {
        pp1[ z ][ j ] = j;
    }
}

Wykonanie takiego prostego kodu w VS2010 powoduje, wystąpienie błędu opisywanego komunikatem:
"A buffer overrun has occurred in Kod.exe which has corrupted the program's internal state"
Będę wdzięczny za każdą pomoc w usunięciu tego błędu.
Pozdrawiam,
Andriej

0

elementy tablicy w C numerujemy od 0...

0

Dzięki, zmieniłem indeksowanie i zadziałało.

Mam jeszcze pytanie o inny sposób tworzenia tej dwuwymiarowej tablicy.
W przypadku jednowymiarowym musiałem robić to w sposób:
double *n = (double *)malloc((J+1) * sizeof(*n));
Jak poprawnie zapisać to w przypadku dwuwymiarowym ?
Z góry dziękuję.

1
andriejz napisał(a):

Dzięki, zmieniłem indeksowanie i zadziałało.

Mam jeszcze pytanie o inny sposób tworzenia tej dwuwymiarowej tablicy.
W przypadku jednowymiarowym musiałem robić to w sposób:
double *n = (double *)malloc((J+1) * sizeof(*n));
Jak poprawnie zapisać to w przypadku dwuwymiarowym ?
Z góry dziękuję.

Robi sie to mniej-wiecej tak:

int n = 10;
int m = 10;
int i;
        
double** array = (double**)malloc(n * sizeof(double*));
    
for (i=0; i < n; ++i)
{
    array[i] = (double*)malloc(m * sizeof(double));
}

W podobny sposob zwalnia sie pamiec: najpierw zwalniasz to co zaalokowales w petli a pozniej zmienna array. Czyli:

for (i=0; i < n; ++i)
{
    free(array[i]);
}

free(array);

Tak swoja droga to skad Ci sie wzielo J+1?

0

Dzięki.
(J+1) to tylko wynikający ze specyfiki zagadnienia łatwiejszy zapis - oczywiście mógłbym użyć JJ = J+1.
Jeszcze raz dzięki za pomoc.

0

Mnie nie chodzilo o roznice w zapisie typu J+1 czy JJ=J+1, bo to niewiele zmienia. Chcialem raczej zapytac dlaczego alokujesz jeden element wiecej? Sa oczywiscie uzasadnione przypadki takiego postepowania jak na przyklad przetwarzanie tekstow gdzie zwykle dopisuje sie na koncu \0 (stad dodatkowy element). Czasem mozna tez zaalokowac jeden element wiecej po to aby w latwy sposob zapewnic sobie numeracje od 1 do n, zamiast od 0 do n-1. Jezeli jest to sytuacja tego typu to ok, jezeli nie jest to ten dodatkowy element jest raczej niepotrzebny :)

0

Dokładnie pisząc, kod rozwiązuje fizyczne zagadnienie dwuwymiarowe (na płaszczyznie), przy czym w komórce 0 i n+1 wpisywane są wartości brzegowe. Ułatwia mi to wykonywanie obliczeń z macierzami trójdiagonalnymi.
Mam przy okazji jeszcze jedno pytanie dotyczące tego jak stworzyć tablicę dwuwymiarową ale zmiennej zespolonej.
W przypadku zmiennej 1D robiłem to za pomocą :
complex<double> *A0 = (complex<double> *)malloc((J+2) * sizeof(*A0));
W przypadku 2D próbowałem zastosować podejście które wcześniej podałeś dla zmiennej rzeczywistej :

complex<double>** n = (complex<double>**)malloc(ZZ * sizeof(complex<double>));
for (i=0; i < Z; ++i)
{
n[i] = (complex<double>
)malloc(JJ * sizeof(complex<double>));
}

ale niestety kod sie wysypuje.

1

Jak już używasz C++ oraz STL to go używaj.

vector<complex<double> > TB(ZZ);
for(size_t i=0;i<TB.size();++i) TB[i]=complex<double>(1,1);

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