Структура с массивом как переменная в c - PullRequest
3 голосов
/ 17 сентября 2011

Мне нужно создать тип данных (в данном случае struct) с массивом в качестве свойства.У меня есть функция инициализатора, которая инициализирует эту структуру данных и дает массиву указанный размер.Проблема сейчас заключается в объявлении массива в структуре.например, "int values ​​[]" потребует, чтобы я ввел число в скобках, например values ​​[256]Th3 256 следует указывать при инициализации структуры.Есть ли способ обойти это?

typedef struct 
{
        int values[];      //error here
        int numOfValues;
} Queue;

Ответы [ 3 ]

16 голосов
/ 17 сентября 2011

Структура должна иметь фиксированный размер, известный во время компиляции. Если вам нужен массив переменной длины, вы должны динамически распределять память.

typedef struct {
    int *values;
    int numOfValues;
} Queue;

Таким образом, в вашей структуре хранится только указатель. При инициализации структуры вы назначаете указатель на область памяти, выделенную с помощью malloc:

Queue q;
q.numOfValues = 256;
q.values = malloc(256 * sizeof(int));

Не забудьте проверить возвращаемое значение для указателя NULL и free() любой динамически выделенной памяти, как только она больше не будет использоваться.

9 голосов
/ 17 сентября 2011
#include<stdio.h> 
#include<stdlib.h>
typedef struct Queue {
int numOfValues;
int values[0]; 
} Queue_t;

int main(int argc, char **argv) {
Queue_t *queue = malloc(sizeof(Queue_t) + 256*sizeof(int));
return (1);
}

Таким образом, вы можете объявить «массивы переменной длины».И вы можете получить доступ к массиву 'values' с помощью queue-> values ​​[index]

РЕДАКТИРОВАТЬ: Конечно, вы должны убедиться, что после освобождения вы учитываете 'n * sizeof (int)' вывыделил вместе с sizeof (Queue_t) где n = 256 в приведенном выше примере HTH

3 голосов
/ 17 сентября 2011

Вы можете использовать функции C99, такие как VLA, например,

int main()
{
  int len=1234;
  struct MyStruct {int i,array[len];} var;

  var.array[0]=-1;
  var.array[len-1]=1;

  printf( "%i %i %lu", var.array[0],var.array[len-1],(unsigned long)sizeof(var) );

  return 0;
}
...