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

问题描述 投票:0回答:1

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

c dynamic-arrays
1个回答
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和“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 */ }

 }
© www.soinside.com 2019 - 2024. All rights reserved.