Где ошибка?
От: Аноним  
Дата: 06.02.04 07:31
Оценка: :)
Есть структура:

struct _xStringList
{    
    char ***list;

    int size;

    /*<private>*/
    int al;
};

В ней хранится список строк.
Есть 3 функции для создания нового списка, добавления строк и удаления всего списка.
При запуске программы, где используются данные функции вне VS всё нормально, при запуске в VS
появляется ошибка в *_x_string_list_free. Что может быть за причина?

xStringList *_x_string_list_new(void)
{
    xStringList *lst = (xStringList *)x_malloc(sizeof(xStringList));
    lst->list = (char ***)x_malloc(sizeof(char **) * 255);
    lst->al = 255;
    lst->size = 0;
    return lst;
}
void x_string_list_add(xStringList *lst, int count, ...)
{
    char ***tmp;
    int i;
P1:
    if (lst != NULL)
    {
P2:
        
        if (lst->al > lst->size)
        {
            int i;
            va_list par; 
            lst->list[lst->size] = (char **)x_malloc(sizeof(char *) * count);
            va_start(par, count);
            for (i = 0; i < count; i++)
            {
                lst->list[lst->size][i] = x_strdup(va_arg(par, char *));
            }
            lst->list[lst->size++][i] = NULL;
            va_end(par);
        }
        else
        {    
            tmp = lst->list;
            lst->list = (char ***)x_malloc(sizeof(char **)*(lst->al*=2));
            for (i = 0; i < lst->size; i++) lst->list[i] = tmp[i];
            x_free(tmp);
            goto P2;
        }
    }
    else
    {
        lst = x_string_list_new();    
        goto P1;
    }
}

xStringList *_x_string_list_free(xStringList *lst)
{
    int i, j;
    if (lst != NULL)
    {
        for (i = 0; i < lst->size; i++)
        {
            for (j = 0; lst->list[i][j] != NULL; j++)
            {
                x_free(lst->list[i][j]);
            }    
            x_free(lst->list[i]); /* Здесь ошибка!
        } 
        x_free(lst->list);
        x_free(lst);
    }
    return NULL;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.