хранение данных переменной длины в таблице переменной длины на c

#c #oop #data-structures

#c #ооп #структуры данных

Вопрос:

я должен хранить данные, как показано в этом ->

изображение

я хочу, чтобы интерфейс, подобный set_data(data_id, index, data) , записывал данные в таблицу и get_data(data_id,index) считывал данные из таблицы

я должен реализовать это в коде c.

нужна некоторая логическая помощь для написания кода.

как это можно сделать, используя структуры в c.

хотите реализовать что-то вроде этого.

 struct INDEX
{
    U8 Len;
    U8 data[];
};

struct DATA_ID
{
    struct INDEX index[];
};

struct DATA_ID data_id[max];
  

data[] длина варьируется для каждого индекса и
index[] длина варьируется для каждого data_id

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

1. У вас есть какие-либо идеи, как это написать, или это вопрос «пожалуйста, дайте мне код»?

2. Понимание динамического распределения памяти языка C поможет вам.

3. Просто реализуйте как единую структуру ( struct collection { size_t group_id, index; double data }; ), а затем выделите такой большой блок, какой вам нужен, например struct collection *mycollection = malloc (how_many * sizeof *mycollection); )

Ответ №1:

Для динамического выделения памяти вам необходимо использовать malloc.

Один совет для вас: каждый раз, когда вы хотите инициализировать тип данных неизвестной длины (размера), вероятно, хорошей идеей будет использовать malloc . Единственным другим решением было бы использовать достаточно большой тип данных для инициализации неизвестного типа данных, но это просто тратит впустую память, а часто и производительность.

Скопировано изhttps://www.tutorialspoint.com/c_standard_library/c_function_malloc.htm

 #include <stdio.h>
#include <stdlib.h>

int main () {
   char *str;

   /* Initial memory allocation */
   str = (char *) malloc(15);
   strcpy(str, "tutorialspoint");
   printf("String = %s,  Address = %un", str, str);

   /* Reallocating memory */
   str = (char *) realloc(str, 25);
   strcat(str, ".com");
   printf("String = %s,  Address = %un", str, str);

   free(str);
   
   return(0);
}
  

Вывод:

 String = tutorialspoint, Address = 355090448
String = tutorialspoint.com, Address = 355090448
  

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

1. Приведение вызова malloc не имеет смысла. И вам действительно следует добавить sizeof (char) в свой malloc, чтобы избежать проблем с различными системами.

2. Это учебное пособие, его цель — быть простым. Кстати. Цель malloc — выделить достаточно памяти для хранения строки str длиной 15 байт.

3. Да, но в некоторых системах возможно, что размер символа не равен 1 байту напрямую, поэтому вам следует добавить sizeof в вызов malloc. Я также не говорил, что у malloc не было цели, но приведение его вызова есть.