#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 '' }