我的结构如下:
struct Query {
int pages[];
int currentpage;
};
我想知道在创建结构后是否可以设置此数组的大小。
Query new = malloc(sizeof(struct Query));
在此之后,我将执行一些计算,然后告诉我pages[]
需要的大小。如果pages[]
需要大小为4,我该如何设置它?
答案 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