Страницы

Поиск по вопросам

вторник, 7 января 2020 г.

Динамические массивы в СИ

#c


Не могу разобратся с динамическими массивами. 
Делаю динамический массив, с произвольным индексом, так - 

typedef struct
{
   int offset;
   int len;
}student;

struct student **students = NULL;

students[5000] = (student*)malloc(sizeof(student));
students[5000]->offset = 1; // здесь пишет dereferencing pointer to incomplete type
students[5000]->len = 2;

students[14] = (student*)malloc(sizeof(student));
students[14]->offset = 10;
students[14]->len = 20;


Понимаю, что тут не хватает ещё выделения памяти для самих students, как написать
не знаю. WinXP, DevCPP (mingw?)
Количество элементов в students заранее неизвестно, и они могут идти не последовательно.

UPDATE: Вот рабочий код

typedef struct
{
    int offset;
    int len;
}student;

student* students = malloc(5000 * sizeof(student));

students[4999].offset = 1;
students[4999].len = 2;

students[14].offset = 10;
students[14].len = 20;

printf("%d",students[4999].len);


UPD #2:
Вот очень хороший модуль uthash для хеш массивов. Отличная и понятная документация,
множество примеров.

Ещё хочу попробовать Красночерные деревья от MIT
    


Ответы

Ответ 1



Что за страшное students[5000]? =) В своём коде вы дословно пытаетесь присвоить 5001-му элементу массива students (который равен NULL), указатель на область памяти, достаточной для одного экземпляра структуры student. Если вам нужно выделить память под 5000 записей типа student, то сделать это можно так: students = (student**)malloc(5000 * sizeof(student)); И после завершения работы с данными не забудьте очистить память во избежение утечек! free(students); UPDATE. Если вам нужно некое поле-челочисленный идентификатор студента, выделите в структуре дополнительную поле под этот идентификатор, а студента с 5000 ID ищите перебором по этому полю. Иначе вам придётся либо выделять память под всех студентов, либо реализовывать хэш-таблицы или другие способы поиска по ключу. То, что вы хотите сделать на самом деле не имеет никакого смысла если задуматься, как компьютер производит доступ к элементу массива. Если у вас не выделена память под предыдущие элементы, как ему узнать, в какой ячейке искать 5000? А если вам нужно добавить 3000, а память между 0 элементом и 5000 уже занята? Именно поэтому язык не допускает таких трюков.

Комментариев нет:

Отправить комментарий