是否可以在堆上分配一个数组,即使它是在函数内的范围内?这是我的C程序:
void SimpleTextEditor()
{
char textEditor[1000000];
char operationText[1000002];
//do something with the arrays
}
这导致stackOverflow异常,原因很明显,我试图分配两个大型数组。如果我将任何一个数组移到函数外部并使其成为全局(文件级变量),那么它就可以在堆上分配全局变量。
但我不想让我的变量变得全球化。是不是可以使用malloc和calloc为数组动态分配内存?
答案 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 */