2015-04-28 4 views
3

NULL Я нашел много «указатель становится NULL» вопросы, но изо всех сил, чтобы применить ответы на мою проблемуC Указатель становится в цикле

У меня есть 3 вложенных структур. Struct A должен содержать массив структуры B, который содержит один-структуру C, который сам должен содержать массив int:

typedef struct { 
    int32_t *data; 
    uint16_t nData; 
    uint16_t dataOffset;   
} Window; 

typdef struct { 
    Window *window; 
    const char *datasetPath; 
} Dataset 

typedef struct { 
    char *id; 
    uint8_t count; 
    Dataset *datasets; 
} DatasetGroup; 

У меня есть new функции для структур:

int8_t dataset_new(Dataset *ds, const char *datasetPath, uint16_t winSize){ 
    ds->datasetPath = datasetPath; 
    ds->window = malloc(sizeof(*(ds->window)); 
    ds->window->data = malloc(sizeof(int32_t) * (winSize)); 
    return 0; 

int8_t datasetgroup_new(DatasetGroup *dg, char *id){ 
    dg->id = id; 
    dg->count = 0; 
    dg->datasets = malloc(sizeof(*(dg->datasets)) * 255); 
} 

И я имеют функцию add, чтобы добавить Dataset в DatasetGroup:

int8_t datasetgroup_add(DatasetGroup *dg, const char *filePath, uint16_t winSize){ 
     // Create the dataset 
     Dataset ds; 
     dataset_new(&ds, filePath, winSize); 

     // Add the dataset to the dataset array 
     dg->datasets[dg->count] = ds; 
     dg->count++; 
     return 0; 
     } 

я тогда перебирать наборы данных для того, чтобы заполнить данные, делать такие вещи, как:

 for (i = 0 ; i < datasetCount ; i++){ 
     Dataset *ds = &(dg->datasets[i]) 

Всегда на 2 Интерактивных, то data массива становится нулевым указателем: данные = ds-> окно-> данные

Я понимаю, что я сделал что-то неправильно преходящие указатели вокруг (?), но я не уверен, что именно я сделал неправильно ....

+2

Отмеченный код выглядит хорошо для меня. Можете ли вы опубликовать [MCVE] (http://stackoverflow.com/help/mcve)? –

+0

@RSahu Мне придется потратить немного времени на резку материала, чтобы попытаться довести его до минимума, который все еще вызывает его .... (вероятно, хорошее упражнение любым способом). Я буду работать над этим .... – jramm

+0

Ошибка, вероятно, в другом месте. Получите вашу программу, запущенную в отладчике. Определите адрес указателя, который в конечном итоге станет нулевым, и установите точку останова данных на этом адресе (например, что-то типа '& dg-> datasets [1] .window-> data'). –

ответ

1

Это выглядит хорошо. Поэтому проверьте другую часть кода. Вы можете отлаживать код по строкам, чтобы вы могли понять сегмент, создающий эту ошибку.

+0

Вы правы, спасибо. Ошибка была в другом месте. Простая ошибка при распределении памяти означала, что я не выделял память для более чем 1 структуры (я думал, что я был) – jramm

Смежные вопросы