Podstawowe typy danych: gsl_block, gsl_vector, gsl_matrix, oraz odmiany dla typów liczbowych innych niż double. Dla konsystencji cała pamięć jest alokowana poprzez strukturę gsl_block. Wektory i macierze są tworzone przez slicing danego bloku. Domyślnie wektory i macierze mają włączone sprawdzanie poprawności indeksu.
// Definicje funkcji do zarządzania blokami są w tym nagłówku.
#include <gsl/gsl_block.h>
typedef struct {
size_t size; // rozmiar bloku
double *data; // wskaźnik do obszaru pamięci
} gsl_block;
// Definicje funkcji do zarządzania wektorami są w tym nagłówku.
#include <gsl/gsl_vector.h>
typedef struct {
size_t size; // liczba elementów wektora; zakres [0, size-1]
size_t stride; // rozmiar jednego elementu (fizycznie)
double *data; // wskaźnik do obszaru pamięci (do pierwszego elem)
gsl_block *block; // wskaźnik do bloku posiadanego przez wektor
int owner; // ownership flag (1-posiada, 0-nie posiada)
} gsl_vector;
// Położenie w pamięci i-tego elementu to v->data[i*v->stride].
// Dzięki stride można chyba tworzyć wektory przechowujące różne
// inne obiekty. Można też zrobić widok np. tylko na parzyste elementy.
// Definicje funkcji do zarządzania macierzami są w tym nagłówku.
#include <gsl/gsl_matrix.h>
typedef struct {
size_t size1; // zakres wierszy [0, size1-1]
size_t size2; // zakres kolumn [0, size2-1]
size_t tda; // fizyczny rozmiar wiersza
double *data; // wskaźnik do pierwszego elementu macierzy
gsl_block *block;
int owner;
} gsl_matrix;