RAJESH1601105065 Ответов: 3

Как создать динамический массив внутри структуры?


Как создать динамический массив внутри структуры?
Могу ли я сделать следующее внутри структуры?
Тип int *Р=(инт*)Танос(оператор sizeof(тип int));

Что я уже пробовал:

Я пробовал, но это показывает некоторую ошибку .

Rick York

Попробуйте что-нибудь более полезное. Выделение одного целого числа практически никогда не выполняется, потому что указатель имеет тот же размер, что и значение в 32-битном мире, и он меньше в 64-битном мире. Попробуйте выделить массив чего-то или целую структуру. Это будет гораздо более реалистично.

3 Ответов

Рейтинг:
1

Sandeep Mewara

Ссылка: указатели - как включить динамический массив внутри структуры в C? - переполнение стека[^]
Выкладываю то что есть здесь для быстрого просмотра:

#include <stdlib.h>

struct my_struct {
    int n;
    char s[];
};

Когда вы выделяете пространство для этого, вы хотите выделить размер структуры плюс объем пространства, который вы хотите для массива:
struct my_struct *s = malloc(sizeof(struct my_struct) + 50);

В этом случае гибкий элемент массива представляет собой массив char, а sizeof(char)==1, поэтому вам не нужно умножать его размер, но так же, как и любой другой malloc, вам нужно было бы сделать это, если бы это был массив какого - то другого типа:
struct dyn_array { 
    int size;
    int data[];
};

struct dyn_array* my_array = malloc(sizeof(struct dyn_array) + 100 * sizeof(int));

В интернете есть еще много дискуссий по этому поводу.


KarstenK

лучше использовать указатель, здесь cahr *s.
И лучше всего использовать правильный тип данных, потому что это помогает другим кодерам и компилятору. ;-)

jeron1

Согласованный.

Рейтинг:
1

Rick York

В редких случаях я должен использовать calloc и free мне нравится использовать два полезных макроса :

   // allocate memory of a given type - must use free to release it

#define AllocateMemory(count,type)   (type*)calloc(count,sizeof(type))

    // free an object and null it

#define ReleaseMemory(ptr)           { if(ptr) { free(ptr); ptr=nullptr; } }
Я всегда использую calloc, потому что он обнуляет память, а также экономит шаг. Я использую макросы, потому что думаю, что они делают код более ясным и устраняют приведение. Вот пример их использования - выделение массива целых чисел.
int * integerArray = NULL;
integerArray = AllocateMemory( 1024, int );

// do something with the array here

ReleaseMemory( integerArray );
Очень важно, чтобы всегда освободить любую память, что вы выделили. Когда вы этого не делаете, это приводит к утечке памяти, а это очень плохо. Если вы пишете программное обеспечение, которое должно работать в течение нескольких месяцев, утечки могут привести к сбоям, и это очень, очень плохо.


CPallini

Эй, Рик, у Си пока нет nullptr.

Рейтинг:
0

CPallini

В качестве прямого ответа на ваш вопрос попробуйте

#include <stdio.h>
#include <stdlib.h>

struct Foo
{
  // other members here
  int * p;
};


int main()
{
  const size_t ITEMS = 10;

  struct Foo foo;

  foo.p = (int*) malloc( sizeof(int) * ITEMS);

  printf("%p\n", foo.p);

  size_t n;
  for (n = 0; n<ITEMS; ++n)
    foo.p[n]  = n*n;


  for (n = 0; n<ITEMS; ++n)
    printf("foo.p[%lu]=%d\n", n, foo.p[n]);

  free(foo.p);

  return 0;
}



Во всяком случае, обратите внимание, что, как Сандип Мевара предположим, что "динамический массив" в struct он часто сопровождается другим членом, указывающим размер самого массива. Это полезно при прохождении struct в качестве аргумента функции. Например:
#include <stdio.h>
#include <stdlib.h>

struct DynArray
{
  size_t items;
  int *p;
};


void print_dynarray(struct DynArray da)
{
  size_t n;
  for (n = 0; n < da.items; ++n)
    printf("item[%lu] = %d\n", n, da.p[n]);
}

int main()
{

  const size_t ITEMS = 10;

  struct DynArray da;

  da.items = ITEMS;
  da.p = (int*) malloc( sizeof(int) * da.items);

  size_t n;
  for (n = 0; n<ITEMS; ++n)
    da.p[n]  = n*n;

  print_dynarray( da );

  free(da.p);
  da.items = 0;

  return 0;
}