我最近正在研究C中的一个项目。我需要在struct中分配一个数组,并且需要从用户那里获取它的大小。但是由于特定的要求,我不能使用指针然后使用malloc分配内存。
我的代码如下:
#define arraySize size
typedef struct sample{
int keys[arraySize]
int pointers[arraySize + 1]
} sample;
int main(){
//size should be obtained from user input
size = 15;
}
如果结构在main中定义,它可以正常工作,但问题是结构不是全局的。如果我声明代码中提到的结构,它会给出错误消息,指出数组大小需要是常量。任何人都可以帮我解决这个问题吗?
(只是给出评论的例子。)
我认为有几种典型的处理方案的方法:
方法1:指向main
堆栈上分配的资源的全局指针(已在其他注释中提出):
根据Jonathan Leffler的评论,该变体使用C99特征/ GCC扩展(w.r.t C89)用于可变修改类型/可变修改阵列。
struct sample *globalSample = NULL;
int main(){
//size should be obtained from user input
size = 15;
struct sample{
int keys[size];
int pointers[size + 1];
} mySample;
globalSample = &mySample;
}
此变体使用alloca
和“flexible array member”。根据Jonathan Leffler在下面的评论,请注意C89和C规范的后续版本之间的官方定义语法的变化。
struct inner {
int key;
int pointer;
};
struct sample {
unsigned int num_allocated;
struct inner members[1]; // struct hack
};
struct sample *globalSample = NULL;
int main(){
//size should be obtained from user input
size = 15;
globalSample = alloca((size+1) * sizeof(struct sample));
globalSample->num_allocated = size; /*just for book-keeping*/
globalSample->members[0].key = /*...*/;
globalSample->members[0].pointer = /*...*/;
globalSample->members[1].key = /*... reaching past declared size */
globalSample->members[1].pointer = /*...*/;
}
方法2:定义最大大小,并根据它验证用户输入。
#define MAX_ENTRIES 4096
struct sample{
int keys[MAX_ENTRIES];
int pointers[MAX_ENTRIES + 1];
} globalSample;
int main(){
//size should be obtained from user input
size = 15;
if(MAX_ENTRIES < size) { /* error case */ }
}