C newbie: могу ли я иметь динамически распределенные структуры фиксированного размера? [Дубликат]

Программирование на интерфейс говорит: «Мне нужна эта функциональность, и мне все равно, откуда она».

Рассмотрим (на Java) интерфейс List по сравнению с ArrayList и LinkedList конкретных классов. Если все, о чем я забочусь, это то, что у меня есть структура данных, содержащая несколько элементов данных, к которым я должен обращаться через итерацию, я бы выбрал List (и это 99% времени). Если я знаю, что мне нужно вставить / удалить постоянное время с любого конца списка, я бы выбрал конкретную реализацию LinkedList (или, более вероятно, использовать интерфейс Queue ). Если я знаю, что мне нужен произвольный доступ по индексу, я бы выбрал конкретный класс ArrayList.

0
задан Karmel 29 August 2015 в 19:03
поделиться

2 ответа

Вы на правильном пути. Однако нет «гибкой структуры». Вы хотите использовать элемент гибкого массива (avail с C99) в struct:

typedef struct {
    int age;
    size_t name_size;    // size of the array, not length of the name!
    char name[];         // Flexible array member
} Structure;

int main(void) {
    Structure *one = malloc(sizeof(*one) + SIZE_OF_NAME_ARRAY);
}

Примечание. Я добавил поле name_size. C не сохраняет размер выделенных массивов, поэтому вам может понадобиться это для безопасной копирования / сравнения и т. Д. (Предотвратите переполнение буфера).

Использование *one делает этот термин независимым от используемого фактического типа. Размер такой структуры такой, как если бы в элементе были нулевые элементы. Тем не менее, он будет правильно выровнен, поэтому он может отличаться от того же struct без массива.

Также обратите внимание, что вы должны изменить выделенный размер, если используете другой, чем массив char, чтобы что-то вроде sizeof(element_type) * ARRAY_SIZE. Это не обязательно для char s, так как их размер определяется стандартом как 1.

4
ответ дан too honest for this site 22 August 2018 в 00:03
поделиться
  • 1
    Должен ли я поместить name_size в struct? Вместо этого я могу просто сделать это, например. #define РАЗМЕР 81? – Karmel 29 August 2015 в 19:26
  • 2
    @ Karmel: Как я сказал в своем примечании: вам, конечно, не нужно. Он просто подходит для использования с вашим гибким массивом, поэтому вам не нужно передавать его каждой функции, которой может понадобиться эта информация. Разумеется, использование константы также работает, но в чем смысл использования члена массива flexible вместо одного с константой (например, `name [SIZE])? – too honest for this site 29 August 2015 в 19:55
  • 3
    @ Олаф, я думаю, что твоя скобка ошибалась. – Jens Gustedt 29 August 2015 в 20:22
  • 4
    @JensGustedt: Спасибо! Сначала я действительно не знал, что вы имеете в виду. Не стесняйтесь редактировать, если хотите. В любом случае, я проверю изменения, чтобы узнать из моих ошибок / опечаток. – too honest for this site 29 August 2015 в 20:35
  • 5
    @JensGustedt: Чтение вашего профиля, где вы приветствуете отзывы: есть ли чат или что-то подобное? – too honest for this site 29 August 2015 в 20:37

Мое предположение: гибкая структура была бы той, которая могла бы обрабатывать любой возраст и любое имя.

Поле unsigned int обрабатывало бы любой возраст (в пределах разумного).

Поле char * будет обрабатывать любое имя.

Сама структура была бы:

struct nameAge { unsigned int age;  char * pName; };  

экземпляр структуры был бы:

struct nameAge myNameAge;

Установка поля age:

myNameAge.age = ageValue;

Установка поля name будет:

myNameAge.name = malloc( numCharactersInName+1 );
strcpy( myNameAge.name, nameString );

Как код, полученный для ageValue для возраста и / или символов для NameString, соответствует программисту принять решение / реализации.

1
ответ дан user3629249 22 August 2018 в 00:03
поделиться
  • 1
    Ок, извините, это звучит немного как шутка (без обид (!!), просто заставило меня улыбнуться): & quot; ... будет обрабатывать любой возраст & quot ;. Хорошо, это зависит от того, какой возраст хранить. Если это для (известных) живых видов, разве вы не думаете, что signed short все еще будет более чем достаточным? (Для астрономических возрастов даже uint32_t будет слишком маленьким, otoh). – too honest for this site 29 August 2015 в 19:14
Другие вопросы по тегам:

Похожие вопросы: