从C中的用户输入在struct内部分配数组大小

时间:2018-09-01 06:29:56

标签: c dynamic-arrays

我最近正在用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内部定义了该结构,则可以正常工作,但问题在于该结构不会是全局的。如果我按代码中的说明声明该结构,则会给出错误消息,指出数组大小必须恒定。谁能帮我解决这个问题?

1 个答案:

答案 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 */ }

 }