Jako, ze to mój pierwszy post chciałbym się przywitać i prosić o małe wytłumaczenie.
Poniżej zamieszczę dwa kody, których zadaniem jest obliczenie t iloczynów skalarnych dwóch wektorów długość-wymiarowych.
Pierwszy działający poprawnie:
#include <stdio.h>
#include <stdlib.h>
int main()
{
short i, j;
int wynik;
int *t=malloc(sizeof(*t));
scanf("%d", t);
for(i=0; i<*t; i++)
{
int *dlugosc=(int*)malloc(sizeof(*dlugosc));
wynik=0;
scanf("%d", dlugosc);
int *tab1 = (int*)malloc((*dlugosc)*sizeof(*tab1));
for(j=0; j<*dlugosc; j++)
scanf("%d", (tab1+j));
int *tab2 = (int*)malloc((*dlugosc)*sizeof(*tab2));
for(j=0; j<*dlugosc; j++)
scanf("%d", (tab2+j));
for(j=0; j<*dlugosc; j++)
wynik+=(*(tab1+j))*(*(tab2+j));
printf("%d\n", wynik);
free(tab1);
free(tab2);
free(dlugosc);
}
return 0;
}
a teraz drugi, różniący się tylko tym, że nie tworzę dynamicznie zmiennych t i długość.
#include <stdio.h>
#include <stdlib.h>
int main()
{
short i, j, t, dlugosc;
int wynik;
scanf("%d", &t);
for(i=0; i<t; i++)
{
wynik=0;
scanf("%d", &dlugosc);
int *tab1 = (int*)malloc(dlugosc*sizeof(*tab1));
for(j=0; j<dlugosc; j++)
scanf("%d", (tab1+j));
int *tab2 = (int*)malloc(dlugosc*sizeof(*tab2));
for(j=0; j<dlugosc; j++)
scanf("%d", (tab2+j));
for(j=0; j<dlugosc; j++)
wynik+=*(tab1+j)*(*(tab2+j));
printf("%d\n", wynik);
free(tab1);
free(tab2);
}
return 0;
}
nie wiem czemu, ale ten kod wyrzuca w Visual Studio 2008 taki błąd:
Run-Time Check Failure #2 - Stack around the variable 'dlugosc' was corrupted.
Po przydzieleniu zmianie przydzielania pamięci dla dlugosci na dynamiczne to samo pojawiło się dla t, tak wiec w dzialającym kodzie obie te zmienne są dynamicznie alokowane...
Według tego co wygooglowałem to błąd ten oznacza tyle, że piszę po nie zaalokowanej pamięci, tyle że debugowalem ten program, do tego nie jest on zakomplikowany i wychodziło mi cały czas że wszystko jest ok, tym bardziej, że problemu nie ma gdy zmienne są alokowane dynamicznie...
EDIT: błąd pojawia się przy zamykaniu aplikacji, tzn po wykonaniu ostatniego nawiasu klamrowego po returnie