Allora dato l'orario potrei anche sbagliare, ma chredo che il problema sia dovuto al fatto che non allochi effettivamente le matrice di caratteri (insomma i doppi puntatori) della struttura, ho provato a modificare il codice per adattarlo alla mancanza delle interfacce sqlite e ne ho ricavato questo:
codice:
int callbackSelect(void *not_used, int row_fields_number, char **row_values, char **row_fields)
{
    int i;
    char new_fields[row_fields_number][200]; //questi li puoi eliminare
    char new_values[row_fields_number][200];//idem come sopra
    DBRow new_row;

    new_row = (DBRow)malloc(sizeof(DBResult));
    if (new_row == NULL)
    {
        DBError("Memoria esaurita");
        return 1;
    }
    else
    {
        new_row->values = (char**)malloc(sizeof(char*)*row_fields_number);//qui allochi i putatori ai puntatori
        new_row->fields = (char**)malloc(sizeof(char*)*row_fields_number);//idem come sopra
        if (new_row->values == NULL || new_row->fields == NULL)
        {
            DBError("Memoria esaurita");
            return 1;
        }
        else
        {
            //Questo è il codice che ho aggiunto. Per ogni puntatore a puntatore creato allochi un array di caratteri di 200.
            for(i = 0; i < row_fields_number; i++)
            {
                new_row->values[i] = (char*)malloc(sizeof(char)*200);
                new_row->fields[i] = (char*)malloc(sizeof(char)*200);
            }
            for (i = 0; i < row_fields_number; i++)
            {
                strcpy(new_row->values[i], row_values[i]);
                strcpy(new_row->fields[i], row_fields[i]);
            }
            new_row->fields_number = row_fields_number;
            new_row->next = __result_rows;
            __result_rows = new_row;
            __current_row = new_row;
            return 0;
        }
    }
}
Spero ti sia di aiuto