Run-Time Check Failure #2

0

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

0

dlugosc i t, to short (2B). w scanf probujesz wczytac do nich inta (4B)

Btw:

int *t=malloc(sizeof(*t));

sizeof(*t) zwraca rozmiar wskaznika a nie inta, przy innych typach moze sie zaczac Ci cos psuc (np sizeof(*char) == 4)

0

Nie pomyślałem o czymś takim, choć wydaje się to jasne... muszę więcej poczytać o scanf i printf... :/

Dziękuję za pomoc.

A co do alokacji z uzyciem wskaznika to porobilem sobie testy i wyszlo mi ze sizeof(*t) zwróci wielkosc na którą wskazuje wskaznik, jesli bylby to char *t wartosc bylaby 1, short *t 2 itd, w przypadku sizeof(t), gdzie wczesniej bylo char, short... *t, to zawsze będzie 4.

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