4

我需要创建一个以数组为属性的数据类型(在本例中为结构)。我有一个初始化函数,它初始化这个数据结构并给数组一个指定的大小。现在的问题是在结构中声明数组。例如“int values[]”将要求我在括号中输入一个数字,例如 values[256]。初始化结构时应指定 Th3 256。有没有办法解决这个问题?

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

3 回答 3

17

结构必须具有在编译时已知的固定大小。如果你想要一个可变长度的数组,你必须动态分配内存。

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

这样你就只有指针存储在你的结构中。在结构的初始化中,您将指针分配给使用 malloc 分配的内存区域:

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

记住在不再使用指针时检查NULL指针的返回值和任何动态分配的内存。free()

于 2011-09-17T08:56:20.357 回答
9
#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);
}

这样您就可以声明“可变长度数组”。您可以使用 queue->values[index] 访问您的数组“值”

编辑:当然你需要确保一旦你释放你考虑到你已经分配的'n * sizeof(int)'以及上面示例HTH中n = 256的sizeof(Queue_t)

于 2011-09-17T10:39:11.827 回答
3

您可以使用 VLA 等 C99 功能,例如

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;
}
于 2011-09-17T11:49:10.527 回答