我最近正在用C语言开发一个项目。我需要在结构内分配一个数组,并且需要从用户那里获取其大小。但是由于特定的要求,我不能使用指针,然后使用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内部定义了该结构,则可以正常工作,但问题在于该结构不会是全局的。如果我按代码中的说明声明该结构,则会给出错误消息,指出数组大小必须恒定。谁能帮我解决这个问题?
答案 0 :(得分:0)
(仅举一些例子进行评论。)
我认为有几种处理情况的典型方法:
方法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
和“弹性数组成员”。 Per 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 */ }
}