[英]C: How do I initialize a global array when size is not known until runtime?
[英]How to declare and initialize this array of structs in C when the length is not known till runtime?
#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;
}
}
#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 - 声明一个指针,该指针将在运行时使用malloc
或calloc
分配内存。
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.