В настоящее время у меня есть структура Struct1 с указателем на Struct2, который выделяется несколько раз на основе некоторых условий в коде. Я попытался выделить его test->Struct2Pair[i] = malloc(sizeof(struct Struct2));
таким образом, но, похоже, это не удалось. Есть идеи, что я делаю неправильно?
Вот упрощенная версия того, что я пытаюсь сделать.
struct Struct2 {
int x;
int y;
};
struct Struct1 {
struct Struct2 *Struct2Pair;
int val;
};
int main()
{
struct Struct1 *test = malloc(sizeof(struct Struct1));
for ( int i = 0; i < 5; i++ )
{
test->Struct2Pair[i] = malloc(sizeof(struct Struct2));
}
return 0;
}
Спасибо!
Struct2Pair
не инициализирован — вы не можете просто начать присваивать ему значения, как если бы это был допустимый массив. По крайней мере, вам понадобитсяtest->Struct2Pair = malloc(5 * sizeof(struct Struct2));
, который выделяет память для 5 элементов типаstruct Struct2
. Но если вы собираетесь просто жестко запрограммировать массив, почему бы не определить его просто какstruct Struct2 Struct2Pair[5];
в первую очередь?@paddy, как я уже сказал, 5 - это просто пример. Это число зависит от некоторых входных данных и некоторых вычислений. Я просто хочу знать, как malloc test->Struct2Pair каждый раз, когда выполняется какое-то условие. Это может быть 1... может быть 100. Я не знаю, как это сделать.
@JaneDoe: Когда вы делаете
test->Struct2Pair[i]
, вы пытаетесь получить доступ к ячейке памятиStruct2Pair
, которая пока не указывает ни на что значимое.Если вам нужно знать, сколько элементов содержится в массиве, вам нужно где-то сохранить это значение (возможно, в дополнительной переменной в
Struct1
). В противном случае у вас нет возможности узнать, достаточно ли велик массив (если вы планируете изменить его размер позже с помощьюrealloc
или чего-то еще). Я поддерживаю свой комментарий о том, как выделить массив с помощьюmalloc
. Ты делаешь это неправильно. Единственная модификация здесь заключается в использовании переменного размера вместо жесткого кодирования5
и сохранении значения где-нибудь.Это время выполнения и неизвестно при распределении Struct2Pair. Он продолжает выделяться один за другим, если выполняются определенные условия. Будет ли ваше решение работать в этом случае?
Да. Вы несете ответственность за отслеживание подсчета и распределения соответственно. Если вы не знаете количество элементов в начале, вы можете установить счетчик на ноль и указатель на NULL. Затем в любое время, когда вам нужно добавить элемент, увеличьте количество и вызовите
realloc
. Это не самое эффективное решение, но оно будет работать и будет самым простым для понимания новичком.А, имеет смысл. Спасибо @падди