C语言中如何初始化大小未知的全局数组供主函数使用
全局动态数组实现方案
事先不确定全局数组大小的场景,不需要提前声明定长数组,用全局指针+全局长度变量配合堆内存动态分配即可实现,具体做法如下:
- 全局作用域不声明不定长数组,改为定义全局数据指针、全局数组长度两个变量,初始值设为空和0即可:
#include <stdlib.h> int *globarr = NULL; int globarr_len = 0;
- 修正原代码的几处笔误和逻辑错误:
- 关键字
ont为int的拼写错误 - 拷贝逻辑里的
n[i]为返回指针by的笔误 - 原拷贝循环用累加和
output做边界是逻辑错误:output存的是0-99的累加结果4950,远大于arr的实际长度100,会触发栈内存越界,必须按数组实际元素个数设置循环边界
- 关键字
- 在业务逻辑函数里拿到数组实际长度后,给全局指针申请对应大小的堆内存,再把本地数组的数据逐元素拷贝到全局内存中。堆内存的生命周期贯穿整个程序运行期,main函数可以直接访问。
完整修正后的可运行代码如下:
#include <stdlib.h> // 全局指针与长度定义,无需提前固定数组大小 int *globarr = NULL; int globarr_len = 0; int *suma(int *output, int *arr) { *output = 0; for (int i = 0; i < 100; i++) { arr[i] = i; *output += arr[i]; } return arr; } void prose(){ int *by; int output; int arr[100]; by = suma(&output, arr); // 确定数组实际长度后,申请对应大小的全局内存 globarr_len = 100; globarr = (int*)malloc(globarr_len * sizeof(int)); if (globarr == NULL) return; // 内存分配失败直接返回,避免空指针访问 // 逐元素拷贝数据到全局内存 for (int i = 0; i < globarr_len; i++) { globarr[i] = by[i]; } } int main() { prose(); // 此处可直接通过globarr[i]访问元素,通过globarr_len获取数组长度 // 程序退出前释放动态申请的内存,避免内存泄漏 if (globarr != NULL) { free(globarr); globarr = NULL; } return 0; }
补充说明:如果后续全局数组需要存储的元素个数发生变化,可以调用
realloc函数调整globarr指向的内存块大小,不需要在程序编译阶段就固定数组长度。
内容的提问来源于stack exchange,提问作者lena
相关产品推荐
相关产品推荐

