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

时间:2017-02-08 01:36:15

标签: c arrays malloc

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

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

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

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

3 个答案:

答案 0 :(得分:2)

  

是否无法使用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)

答案 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 :(得分:1)

可以定义使用malloc()calloc()动态分配内存。只需将它们分配到函数或main(),如果您不希望将它们设为全局。处理大数据时,最好在堆上分配空间,只需要为更多数据腾出更多空间。

  • 使用malloc()时:

      

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

    示例:

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

      

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

    示例:

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

      

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

    示例:

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

注意: malloc()calloc()都可以在出错时返回NULL,因此最好检查它们。你这样检查:

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