🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# C 动态内存分配 > 原文: [https://www.programiz.com/c-programming/c-dynamic-memory-allocation](https://www.programiz.com/c-programming/c-dynamic-memory-allocation) #### 在本教程中,您将学习使用标准库函数:`malloc()`,`calloc()`,`free()`和`realloc()`在 C 程序中动态分配内存。 如您所知,数组是固定数量的值的集合。 声明数组的大小后,您将无法更改它。 有时,您声明的数组的大小可能不足。 要解决此问题,可以在运行时手动分配内存。 这在 C 编程中称为动态内存分配。 为了动态分配内存,使用了`malloc()`,`calloc()`,`realloc()`和`free()`这些库函数。 这些函数在`<stdlib.h>`头文件中定义。 * * * ## C `malloc()` 名称`malloc`代表内存分配。 `malloc()`函数保留指定字节数的内存块。 并且,它返回`void`的[指针](/c-programming/c-pointers "C Pointers"),可以将其转换为任何形式的指针。 * * * ### `malloc()`的语法 ```c ptr = (castType*) malloc(size); ``` **示例** ```c ptr = (float*) malloc(100 * sizeof(float)); ``` 上面的语句分配了 400 个字节的内存。 这是因为`float`的大小为 4 个字节。 并且,指针`ptr`保存分配的内存中第一个字节的地址。 如果无法分配内存,则表达式将产生`NULL`指针。 * * * ## C `calloc()` 名称`calloc`代表连续分配。 `malloc()`函数分配内存,并保留未初始化的内存。 而`calloc()`函数分配内存并将所有位初始化为零。 * * * ### `calloc()`的语法 ```c ptr = (castType*)calloc(n, size); ``` **示例**: ```c ptr = (float*) calloc(25, sizeof(float)); ``` 上面的语句在内存中为`float`类型的 25 个元素分配了连续的空间。 * * * ## C `free()` 使用`calloc()`或`malloc()`创建的动态分配内存不会自行释放。 您必须显式使用`free()`释放空间。 * * * ### `free()`的语法 ```c free(ptr); ``` 该语句释放`ptr`指向的内存中分配的空间。 * * * ### 示例 1:`malloc()`和`free()` ```c // Program to calculate the sum of n numbers entered by the user #include <stdio.h> #include <stdlib.h> int main() { int n, i, *ptr, sum = 0; printf("Enter number of elements: "); scanf("%d", &n); ptr = (int*) malloc(n * sizeof(int)); // if memory cannot be allocated if(ptr == NULL) { printf("Error! memory not allocated."); exit(0); } printf("Enter elements: "); for(i = 0; i < n; ++i) { scanf("%d", ptr + i); sum += *(ptr + i); } printf("Sum = %d", sum); // deallocating the memory free(ptr); return 0; } ``` 在这里,我们为`n`个`int`的数量动态分配了内存。 * * * ### 示例 2:`calloc()`和`free()` ```c // Program to calculate the sum of n numbers entered by the user #include <stdio.h> #include <stdlib.h> int main() { int n, i, *ptr, sum = 0; printf("Enter number of elements: "); scanf("%d", &n); ptr = (int*) calloc(n, sizeof(int)); if(ptr == NULL) { printf("Error! memory not allocated."); exit(0); } printf("Enter elements: "); for(i = 0; i < n; ++i) { scanf("%d", ptr + i); sum += *(ptr + i); } printf("Sum = %d", sum); free(ptr); return 0; } ``` * * * ## C `realloc()` 如果动态分配的内存不足或超出要求,则可以使用`realloc()`函数更改先前分配的内存大小。 * * * ### `realloc()`的语法 ```c ptr = realloc(ptr, x); ``` 在此,以新的大小`x`重新分配`ptr`。 * * * ### 示例 3:`realloc()` ```c #include <stdio.h> #include <stdlib.h> int main() { int *ptr, i , n1, n2; printf("Enter size: "); scanf("%d", &n1); ptr = (int*) malloc(n1 * sizeof(int)); printf("Addresses of previously allocated memory: "); for(i = 0; i < n1; ++i) printf("%u\n",ptr + i); printf("\nEnter the new size: "); scanf("%d", &n2); // rellocating the memory ptr = realloc(ptr, n2 * sizeof(int)); printf("Addresses of newly allocated memory: "); for(i = 0; i < n2; ++i) printf("%u\n", ptr + i); free(ptr); return 0; } ``` 运行该程序时,输出为: ```c Enter size: 2 Addresses of previously allocated memory:26855472 26855476 Enter the new size: 4 Addresses of newly allocated memory:26855472 26855476 26855480 26855484 ```