首页 > 解决方案 > 从C中的用户输入分配结构内部的数组大小

问题描述

我最近在用 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 中定义的,它可以正常工作,但问题是结构不会是全局的。如果我声明代码中提到的结构,它会给出错误消息,指出数组大小需要保持不变。谁能帮我解决这个问题?

标签: cdynamic-arrays

解决方案


(仅举评论示例。)

我认为有几种典型的方法可以处理您的场景:


方法 1:main指向在' 堆栈 上分配的资源的全局指针(已在其他评论中建议):

根据 Jonathan Leffler 的评论,此变体将 C99 功能/GCC 扩展(wrt 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 */ }

 }

推荐阅读