【发布时间】:2020-11-03 04:46:01
【问题描述】:
假设我们有一个数组int arr[size] 和一个指向整数int *i 的指针。我们可以使用malloc(sizeof(int) * size) 将一组连续的内存块分配给*i。但是我的问题是int arr[size] 中的内存是如何分配的。在这种情况下,根据我的猜测分配内存块是由编译器完成的。编译器是否隐式进行malloc() 或类似的函数调用?当我们编写类似int arr[] = "You guys are a great help" 的东西时,编译器是如何完成动态内存分配的。
【问题讨论】:
-
int arr[size],如果 size 是编译时间常数,则内存分配在程序开始执行之前完成。否则,它在它出现的函数调用的堆栈中。 -
对于大多数系统,包括数组在内的局部变量都存储在堆栈中。当函数被调用时,编译器会生成代码来为变量保留一块堆栈(通常通过操作一个或多个 CPU 寄存器)。
-
编译器知道函数中变量的个数,以及每个变量的大小(包括数组,基本上和
malloc一样计算大小)。 -
堆栈溢出是指您的程序超出编译器创建的堆栈区域。例如,通过索引超出本地数组的范围。
-
这里有很多误解。有关变量存储位置的说明,请参阅What gets allocated on the stack and the heap?。