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-> окно-> данные
Я понимаю, что я сделал что-то неправильно преходящие указатели вокруг (?), но я не уверен, что именно я сделал неправильно ....
Отмеченный код выглядит хорошо для меня. Можете ли вы опубликовать [MCVE] (http://stackoverflow.com/help/mcve)? –
@RSahu Мне придется потратить немного времени на резку материала, чтобы попытаться довести его до минимума, который все еще вызывает его .... (вероятно, хорошее упражнение любым способом). Я буду работать над этим .... – jramm
Ошибка, вероятно, в другом месте. Получите вашу программу, запущенную в отладчике. Определите адрес указателя, который в конечном итоге станет нулевым, и установите точку останова данных на этом адресе (например, что-то типа '& dg-> datasets [1] .window-> data'). –