是否可以在运行期间在结构中设置数组的大小?

时间:2016-05-12 06:30:50

标签: c arrays struct

我的结构如下:

struct Query {  
    int     pages[];
    int     currentpage;
};

我想知道在创建结构后是否可以设置此数组的大小。

Query new = malloc(sizeof(struct Query));

在此之后,我将执行一些计算,然后告诉我pages[]需要的大小。如果pages[]需要大小为4,我该如何设置它?

5 个答案:

答案 0 :(得分:14)

在C99中,您可以使用Flexible array members

struct Query {  
    int currentpage;
    int pages[]; /* Must be the last member */
};

struct Query *new = malloc(sizeof(struct Query) + sizeof(int) * 4);

答案 1 :(得分:7)

pages成员的类型更改为指针。

struct Query {  
    int *pages;
    int currentpage;
};

struct Query *test = malloc(sizeof(struct Query));

if (test != NULL)
{
   //your calculations

   test->pages = malloc(result_of_your_calcs);
   if (test->pages != NULL)
   {
      // YOUR STUFF
   }
   else
   {
      // ERROR
   }
}
else
{
   // ERROR
}

当你free你的结构时,你必须这样做。

free(test->pages);
free(test);

答案 2 :(得分:5)

您可以使用灵活阵列成员@AlterMann's answer中的详细信息)( C99 + )或零长度数组( GNU C )。

引自https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html

  

GNU C中允许使用零长度数组。它们作为结构的最后一个元素非常有用,它实际上是一个可变长度对象的头:

struct line {
   int length;
   char contents[0];
};

struct line *thisline = (struct line *)
   malloc (sizeof (struct line) + this_length);
thisline->length = this_length;

对于标准C90,链接网站提及

  

在ISO C90中,您必须给contents一个长度为1,这意味着您要浪费空间或将参数复杂化为malloc

这意味着要使代码在标准C90 / C89中运行,char contents[0];应为char contents[1];

答案 3 :(得分:2)

最好的解决方案是使用指针int而不是数组。

您需要更改:

int pages[];

到:

int *pages;

然后像这样动态分配:

Query *new = malloc(sizeof(struct Query));
if (new == NULL)
    printf ("Error\n");
else
{
    new->pages = malloc(4*sizeof(int));
    if (new->pages == NULL)
       printf ("Error\n");
}

否则,如果您想保留格式,则使用C99模式。将pages声明为结构的最后一个成员,如下所示:

struct Query {  
    int currentpage;
    int pages[];
};

然后执行:

Query *new = malloc(sizeof(struct Query) + 4*sizeof(int));

答案 4 :(得分:2)

将其声明为指针并在之后使用malloc

struct Query {  
    int * pages;
    int   currentpage;
};

. . .

struct Query obj;
obj.pages = malloc(n * sizeof(int));   // n is the length you want