Как динамически выделить память для массива указателей внутри структуры

вот что я сделал до сих пор

struct test_case {
  int n;
  int *test[];
};


struct test_case *test_case_struct = (struct test_case *)malloc(
      sizeof(struct test_struct) + 100 * sizeof(int));

Мне нужно выделить n указателей в массиве указателей "test". Насколько я знаю, мне нужно выделить место для структуры, а затем еще немного для массива указателей, но когда я пытаюсь скомпилировать это, я получаю сообщение об ошибке недопустимое использование оператора sizeof для неполной структуры типа test_struct

если кто-нибудь может сообщить мне, как я могу использовать значение n в качестве пользовательского ввода и сделать возможным int *test [n].


person Shiva Kumar    schedule 21.11.2018    source источник
comment
попробуйте использовать typedef при создании своей структуры, а затем используйте имя типа в вашем sizeof.   -  person SPlatten    schedule 21.11.2018
comment
Дополнительное примечание, но учтите, что не приводит результат malloc.   -  person StoryTeller - Unslander Monica    schedule 21.11.2018


Ответы (3)


Не повторяйте имена типов. Вы уже дважды наткнулись на собственный код, потому что сделали это. Вы допустили ошибку, введя неправильный тег структуры и перепутав int* с int.

Более выносливое распределение будет выглядеть так

struct test_case *test_case_struct =
  malloc(sizeof (*test_case_struct) + sizeof (test_case_struct->test[0]) * 100);

Это здесь будет выделять размер того, на что указывает test_case_struct, плюс еще 100 того, что должно быть test_case_struct->test[0]. Теперь вы можете поиграть с определением структуры, не прерывая этот вызов malloc. И если вы внесете критическое изменение (например, переименуете test), компилятор немедленно уведомит вас об этом.

person StoryTeller - Unslander Monica    schedule 21.11.2018

Вам нужно изменить

  sizeof(struct test_struct)

to

   sizeof(struct test_case)

поскольку test_struct не является правильным типом структуры.

В лучшем случае вы также можете использовать уже объявленное имя переменной, например

struct test_case *test_case_struct = malloc(
         sizeof (*test_case_struct) + n * sizeof(int*));

Тем не менее, вам нужно выделить память объемом int *s, а не ints, для гибкого члена.

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

int main(void)
{
    int n = 0;
    puts("Enter the count of pointers");
    if (scanf("%d", &n) != 1) {
        puts("Got a problem in the input");
        exit (-1);
    }
    struct test_case *test_case_struct = malloc( sizeof(struct test_case) + n * sizeof(int*));
    printf("Hello, world!\n");
    return 0;
}
person Sourav Ghosh    schedule 21.11.2018
comment
мое намерение состоит в том, чтобы иметь массив указателей, который может указывать на элементы n. где n – вводимые пользователем данные. и n, и массив указателей находятся внутри структуры. извините за опечатку в фрагменте там - person Shiva Kumar; 21.11.2018
comment
@ShivaKumar Итак, вы говорите, что вам не нужен массив указателей на ints, а массив ints, количество ints будет храниться в n, верно? - person Sourav Ghosh; 21.11.2018
comment
Неа. если бы у меня был массив указателей int *test[n], n был бы пользовательским вводом (само по себе это не сложно для меня, я делал это раньше), сложность заключается в том, где мне нужно поместить массив указателей int *test[ ] внутри структуры, а также его размер int n внутри структуры. вариант использования, для которого мне это нужно, заключается в том, что пользователь вводит разные квадратные матрицы разных размеров (int n). каждый указатель в test[0], test[1] ... test[n] указывает на массив целых чисел, который в свою очередь имеет n элементы в нем. Я надеюсь, что сделал картину достаточно ясно. - person Shiva Kumar; 22.11.2018

В настоящее время вы используете гибкий массив (он же массив нулевой длины). Которые могут быть распределены, как показано ниже.

struct test_case *test_case_struct =
   malloc(sizeof (*test_case_struct) + 100 * sizeof (int *));

Обратите внимание на отсутствие * вместо int и опечатку sizeof(struct test_struct) в вашем коде.


В качестве альтернативы вы можете использовать указатель на указатель, как показано ниже.

struct test_case {
  int n;
  int **test;
};


struct test_case *test_case_struct = malloc(
      sizeof(*test_case_struct));
test_case_struct->test = malloc(100 * sizeof(int *)); // Allocates 100 pointers
person kiran Biradar    schedule 21.11.2018
comment
А почему гибкий массив не подходит? - person Sourav Ghosh; 21.11.2018
comment
@SouravGhosh Я просто ass*u*me*d OP, возможно, не собирался использовать гибкий массив и случайно объявил такую ​​​​структуру. - person kiran Biradar; 21.11.2018
comment
@kiranBiradar Название предполагает, что желателен массив указателей в структуре. - person Gerhardh; 21.11.2018