C - 数组是静态数据结构.那么如何动态地为它们分配内存呢?



静态数据类型是在内存中具有固定大小的数据类型。由于我们提前声明了数组大小,因此内存中保留了大量字节或空间,以后无法增加。所以这样数组就是静态数据类型。

但是我们可以使用指针或指针数组为数组动态分配内存。我没有清楚地理解整个概念。请帮忙

这些概念是:

// example 1
int array1[256];  // a fixed size, global array of 256 ints, statically allocated
void example2(void)
{
int array2[256];  // an array of fixed size 256, allocated when the function is entered
//...
//...             // and automatically released (deallocated) when the function exits
}
void example3(int n)
{
int array3[n];    // an array of fixed size n, allocated when the function is entered
//...
//...             // and automatically released (deallocated) when the function exits
}
void example4(int n)
{
int *array4;
array4= malloc(n*sizeof(int));  // a dynamically allocated array
//...
free(array4);  // that must be manually deallocated when no longer needed
}

在第一个示例中,数组的大小在编译时确定,并在程序执行期间固定。在整个程序执行过程中,数组驻留在全局内存中。

在第二个示例中,数组的大小也在编译时确定,并在程序执行期间保持固定,但在输入函数时,内存在堆栈上分配。因此,在递归函数中,可以同时存在此数组的多个实例。

第三个示例使用更高版本的 C 标准 (VLA( 的可变大小数组。数组大小在函数执行期间是固定的,但可以在每次函数调用时更改。如果n很大,那么您很容易耗尽堆栈空间,从而导致程序崩溃。

第 4 个示例使用指针从堆中动态分配数组。通过重新分配数组,其大小也可以在调用函数期间更改。堆通常比堆栈大得多,因此对于大型数组,此方法是首选。由于数组不驻留在堆栈上,因此您可以将其返回给调用方(然后调用方必须在不再需要时注意释放它(。

据我了解,您在理解数组和动态内存之间的区别时遇到了一些困难。

例如,每当声明数组时:

char array[10];

您在堆栈中分配了 10 个chars(因此大多数情况下为 10 个字节(。

但是程序不仅有分配数据的堆栈,还有堆。由于数组的大小在编译时是已知的,因此可以已经分配了。但是,如果编译时内存量未知并且需要动态分配,会发生什么情况?然后,您可以在堆中分配所需的内存,并将指针放在堆栈中。例如:

char *ptr;

在堆栈中分配指针,然后您可以使用 malloc(或 calloc(在堆中分配所需的内存:

ptr = malloc(10 * sizeof (char));

这将在堆中分配 10 字节的内存。

一方面,堆栈释放时会自动释放数组,另一方面,堆中分配的内存必须显式释放,否则可能会出现内存泄漏。

另一个注意事项是,当运行多个线程时,每个线程都有自己的堆栈,但它们都共享同一个堆。而在运行多个进程时,每个进程都有自己的堆栈和堆。

最新更新