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

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

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 для неполного типа struct test_struct

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

Ответы [ 3 ]

0 голосов
/ 21 ноября 2018

Вам необходимо изменить

  sizeof(struct test_struct)

на

   sizeof(struct test_case)

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

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

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

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

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

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;
}
0 голосов
/ 21 ноября 2018

Не повторять имена типов.Вы уже дважды наткнулись на свой собственный код, потому что сделали это.Вы допустили ошибку, введя неправильный тег структуры и запутав 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), ваш компилятор незамедлительно уведомит вас.

0 голосов
/ 21 ноября 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
...