You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 20:01:21