首页 文章

如何在函数内部分配大型数组(在堆上使用动态内存分配)

提问于
浏览
1

是否有可能在堆上分配一个数组,即使它在一个函数范围内?这是我的C程序:

void SimpleTextEditor()
    {
        char textEditor[1000000];
        char operationText[1000002];
        //do something with the arrays
    }

这导致stackOverflow异常,原因很明显,我正在尝试分配两个大型数组 . 如果我将任何一个数组移到函数外部并使其成为全局(文件级变量),那么它就可以在堆上分配全局变量 .

但我不想让我的变量全局化 . 是不是可以使用malloc和calloc为数组动态分配内存?

3 回答

  • 1

    是否无法使用malloc和calloc为数组动态分配内存?

    当然有可能:

    char *textEditor = malloc(1000000);
    char *operationText = malloc(1000002);
    //do something with the arrays
    free(operationText);
    free(textEditor);
    

    (注意:如果需要,可以使用 1000000*sizeof(char) ,但 sizeof(char) 始终为1)

  • 2

    如果我将任何一个数组移到函数外部并使其成为全局(文件级变量),那么它将在堆上分配全局变量时起作用 .

    这是错误的假设 . 由于没有给出明确的初始化程序,因此在文件范围定义的数组可能放在data segment内,或者更具体地说放在 .bss 段内 .

    但我不想让我的变量全局化 . 是不是可以使用malloc和calloc为数组动态分配内存?

    当然可以使用 malloc 和朋友动态分配内存 . 但是,因为在编译时已知大小,所以更好的替代方法可以将两个数组声明为 static

    void SimpleTextEditor()
    {
        static char textEditor[1000000];
        static char operationText[1000002];
         //do something with the arrays
    }
    
  • 2

    可以定义使用malloc()calloc()动态分配内存 . 只需在功能中分配它们或 main() 如果你不想让它们全局化 . 处理大数据时,最好在堆上分配空间,只需要为更多数据腾出更多空间 .

    • 使用 malloc() 时:

    malloc()在堆上分配请求的内存,然后返回一个void *指针 .

    Example:

    char *textEditor = malloc(1000000);
    char *operationText = malloc(1000002);
    
    • 使用 calloc() 时:

    calloc()在堆上分配请求的内存,然后返回一个void *指针 . 将内存设置为0 .

    Example:

    char *textEditor = calloc(1000000, sizeof * textEditor);
    char *operationText = calloc(1000002, sizeof * operationText);
    
    • 请务必在最后安全free() .

    free()释放先前由malloc(),calloc()或realloc()分配的内存 .

    Example:

    free(textEditor);
    textEditor = NULL;
    
    free(operationText);
    operationText = NULL;
    

    Note: malloc()calloc() 都可以在错误时返回 NULL ,因此最好检查它们 . 你这样检查:

    if (textEditor == NULL || operationText == NULL) {
        /* handle exit */
    

相关问题