2013-06-16 18 views
5

Próbuję zrozumieć skutki buforowania programowo za pomocą następującego programu. Dostaję segfault z kodem. Kiedyś GDB (skompilowany z -g -O0) i okazało się, że była segmentacja Błąd naBłąd segmentacji podczas wywoływania zegara()

start = clock() (first occourance) 

Czy robię coś źle? Kod wygląda dobrze dla mnie. Czy ktoś może wskazać błąd?

#include <stdio.h> 
#include <sys/time.h> 
#include <time.h> 
#include <unistd.h> 

#define MAX_SIZE (16*1024*1024) 
int main() 
{ 
    clock_t start, end; 
    double cpu_time; 
    int i = 0; 
    int arr[MAX_SIZE]; 

    /* CPU clock ticks count start */ 
    start = clock(); 

    /* Loop 1 */ 
    for (i = 0; i < MAX_SIZE; i++) 
     arr[i] *= 3; 

    /* CPU clock ticks count stop */ 
    end = clock(); 

    cpu_time = ((double) (end - start))/CLOCKS_PER_SEC; 

    printf("CPU time for loop 1 %.6f secs.\n", cpu_time); 

    /* CPU clock ticks count start */ 
    start = clock(); 

    /* Loop 2 */ 
    for (i = 0; i < MAX_SIZE; i += 16) 
     arr[i] *= 3; 

    /* CPU clock ticks count stop */ 
    end = clock(); 

    cpu_time = ((double) (end - start))/CLOCKS_PER_SEC; 

    printf("CPU time for loop 2 %.6f secs.\n", cpu_time); 

    return 0; 
} 

Odpowiedz

4

Spróbuj zmienić:

int arr[MAX_SIZE]; 

do:

int *arr = (int*)malloc(MAX_SIZE * sizeof(int)); 

Jak Potatoswatter zasugerował The array might be too big for the stack ... Można przeznaczyć na stercie, niż na stosie ...

More informations .

8

Tablica może być za duża dla stosu. Zamiast tego spróbuj wpisać static, aby przejść do globalnej przestrzeni zmiennych. Jako dodatkowy bonus zmienne static są inicjowane na wszystkie zero.

W przeciwieństwie do innych rodzajów pamięci, kompilator może sprawdzić, czy zasoby istnieją dla globali podczas kompilacji (a system operacyjny może dwukrotnie sprawdzać w środowisku wykonawczym przed uruchomieniem programu), aby nie było potrzeby radzenia sobie z błędami pamięci. Niezainicjowana tablica nie zwiększy twojego pliku wykonywalnego.

Jest to niefortunna, szorstka krawędź sposobu działania stosu. Żyje w buforze o ustalonym rozmiarze, ustawianym przez konfigurację programu uruchamianego przez program zgodnie z systemem operacyjnym, ale jego rzeczywisty rozmiar rzadko jest sprawdzany na dostępnej przestrzeni.

Witamy w stosie przelewowym!

Powiązane problemy