c - 从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 中定义的,它可以正常工作,但问题是结构不会是全局的。如果我声明代码中提到的结构,它会给出错误消息,指出数组大小需要保持不变。谁能帮我解决这个问题?
解决方案
(仅举评论示例。)
我认为有几种典型的方法可以处理您的场景:
方法 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 */ }
}
推荐阅读
- php - 如何在使用 Laravel 7 的视图中根据文件类型显示图标?
- vue.js - 如何将目录中的所有“vue”文件包含到构建中而不显式导入它们
- docker - vuejs dev 为 docker 构建动态输出(每次更改后更新文件)
- javascript - 仅当用户单击取消时如何触发 CancellationToken
- javascript - 我应该如何创建这个
- php - 如何从自定义异常消息中删除默认的 Laravel 异常消息
- django - 带有 WSGI ModuleNotFoundError 的 Apache 日志
- javascript - 无法使用 php、js、ajax 从联系表单接收信息?
- java - 如何防止 url 在 web 视图中显示
- android - 我无法在使用 Android 9 或 + 并使用 Plugin.BLE Xamarin Forms 时更新蓝牙设备