繁体   English   中英

当长度直到运行时才知道,如何在C中声明和初始化这个结构数组?

[英]How to declare and initialize this array of structs in C when the length is not known till runtime?

foo.c的

#include "main.h"
unsigned char currentBar;
struct foo myFoo[getNumBars()];

void initMyFoo(void)
{
 currentBar=(getNumBars()-1);
 for(i=0; i<(sizeof(myFoo)/sizeof(myFoo[0])); i++)
 {
  myFoo[i].we = 1;
  myFoo[i].want = 0;
  myFoo[i].your = 0;
  myFoo[i].soul = 0;
 }
}

main.c中

#include "foo.h"
unsigned char getNumBars()
{
 return getDipSwitchValues();
}
initMyFoo();

(struct foo在foo.h中声明。)

此代码必须执行而无需对Bars进行硬编码,因为Bars的数量将根据用户设置的DIP开关而变化。 现在我无法初始化myFoo; 我得到错误“初始化程序中预期的常量表达式”。 我是否必须将其初始化为:

struct foo myFoo[];

并在以后更改? 如果是这样,我如何使myFoo []正确长度? 我显然没有与所需大小相对应的常量可用。 我是否需要动态分配这个或什么?

我找到了类似的答案,但它对我来说没什么用处--C ++是一个带有结构数组的类,不知道我需要多大的数组

struct foo* myFoo;
unsigned int myFooSize;

void initMyFoo(void)
{
  myFooSize = getNumBars();
  myFoo = malloc(myFooSize * sizeof(*myFoo));
  for (i=0; i<myFooSize; i++) {
    /* ... */
  }
}

void cleanupMyFoo(void)
{
  free(myFoo);
  myFoo = NULL;
  myFooSize = 0;
}

1 - 在C99中,您可以使用可变长度数组 ,它允许您创建长度由运行时确定的数组。 您也可以通过编译器扩展使用它们(GCC支持它们用于非C99 C和C ++),但这不是一个可移植的解决方案。

int someUnknownSize = 0;

/* some code that changes someUnknownSize */

struct foo myFoo[someUnknownSize];

2 - 声明一个指针,该指针将在运行时使用malloccalloc分配内存。

struct foo *fooPtr = 0; /* null pointer to struct foo */
int sizeToAlloc = 0;
/* determine how much to allocate/modify sizeToAlloc */
fooPtr = malloc(sizeToAlloc * sizeof(*fooPtr));

/* do stuff with the pointer - you can treat it like you would an array using [] notation */
free(fooPtr);

我通常会选择预期的最大数组大小,如果需要,只需调整大小:

type * a = calloc(sizeof(type),exp_array_size);

并且在将一个新值推送到数组上时(好吧,好吧,我把它视为堆栈...),我检查它的当前大小与新的:

if (current_size > max_size) {
    max_size *= 2;
    realloc(a,max_size*sizeof(type));
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM