Проблема с настройкой массива указателей в структуре с помощью malloc

#c #pointers #malloc

Вопрос:

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

выражение должно иметь изменяемое значение lvalue

Вот код структуры:

 typedef struct {  int id;  char *entity[]; }entity;  

Вот распределение памяти в основной функции:

 entity s; s.entity= malloc(30 * sizeof(char *));  

IDE подчеркивает s.entity и выдает ошибку, о которой я упоминал.

Пожалуйста, помогите мне решить эту проблему.

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

1. массив не поддается изменению. Что вы хотите взамен, так это char** set

2. То, как вы это написали, вы должны в основном использовать: entity *s = malloc(sizeof *s 30 * sizeof *s-gt;set);

Ответ №1:

В вашей структуре нет члена с именем entity , только id и set .

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

 entity *s; s = malloc(sizeof(*s)   30 * sizeof(s -gt; set[0]));  

Такого рода члены структуры очень полезны, так как вы можете realloc free использовать их в одном вызове.

Увеличьте размер set массива до 50

 entity *tmp = realloc(s, sizeof(*s)   50 * sizeof(s -gt; set[0])); if(tmp) s = tmp;  

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

1. Я не принадлежу к числу сторонников отказа, но ваше первое предложение не сработало, потому set что это гибкий элемент массива. Я думаю, вы поняли, так как отредактировали свой ответ.

2. @Cheatah: Что вы видите неправильного в первой версии ответа? Он имеет malloc(sizeof(*s) 30 * sizeof(s -gt; set[0])); , что правильно для выделения места для структуры плюс 30 элементов в элементе массива.

3. @EricPostpischil самый первый был неправ 🙂

Ответ №2:

Вот как бы вы распределили указатели:

 typedef struct {  int id;  char **set; }entity;  int how_many_pointers = 30; entity s; s.set= malloc(how_many_pointers * sizeof(char *));  

И для каждого указателя вам придется выделить место для соответствующей строки:

 int i, string_size;  for(i = 0; i lt; how_many_pointers; i  ) {  printf("How many chars should have string number %d ?", i   1);  scanf("%d", amp;string_size);  s.set[i] = malloc((string_size   1) * sizeof(char)); // string   1 due to space for '' }