Различные массивы в динамической структуре, создании, записи, чтении - PullRequest
0 голосов
/ 18 декабря 2018

пролив в точку.У меня есть структура со строкой, char и int.Структура создается динамически, потому что она мне понадобится в разных частях моей программы.

struct A
{
  char staticString[20];
  char* dynamicString;
  char character;
  int integer;
};

Я знаю, хочу ли я создать структуру, я вызываю:

A example = (A)malloc(sizeof(A));

Чтобызаполнить dynamicString и int, которые я использовал:

example->dynamicString = (char*)malloc(sizeof(char*));
example->integer = (int)malloc(sizeof(int));

Неправильно, когда я пытался заполнить staticString и char, он не работал.Даже не спрашивайте, каков был мой код для них, я испробовал множество комбинаций повсюду.

В дополнение к этому кто-нибудь может показать мне примеры, как записывать / читать эти значения?Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

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

sizeof (char) * 20 + sizeof (указатель на char) + sizeof (char) + sizeof (int).

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

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

также, имейте в виду, что malloc возвращает указатель на выделенное место в куче, поэтому если вы используете malloc (sizeof (int)), вы получите указатель на выделение памяти для int в куче, на который указывает указатель int.int.

удачи!

0 голосов
/ 18 декабря 2018

Перво-наперво:

Вы используете C, и, как вы определили структуру, вам нужно объявить указатель следующим образом:

struct A *example;

Далее,malloc возвращает указатель, поэтому вам нужно привести к указателю (а не к структуре):

(struct A *)malloc(sizeof(struct A));

Во-вторых, я не уверен, почему, но эй: - вы пытаетесь динамически выделитьInt в структуре.Как я уже говорил ранее, malloc возвращает указатель, поэтому в вашей структуре вам нужен указатель типа int, например "int *integer;" - вы пытаетесь выделить динамическую строку, однако вы не делаете это правильно, вот что ядумаю, что вы хотите

example->dynamicString = (char *)malloc(sizeof(char) * 10);

Где 10 - размер вашей динамической строки.

Редактировать:

вы также можете заполнить целое число в вашей структуре статически или динамически, ноЯ думаю, что вы намеревались использовать статический подход:

example->integer = 123;

Динамический подход был бы (при условии, что в вашей структуре int *integer):

example->integer = (int *)malloc(sizeof(int));
*(example->integer) = 123;
...