C语言分配内存是C语言编程中的一个重要概念,它涉及到如何在程序运行时为变量、数组等数据结构分配内存空间,在C语言中,内存分配是通过使用动态内存分配函数来实现的,这些函数包括malloc、calloc、realloc和free,本文将详细介绍这些内存分配函数的用法和注意事项。
1、malloc函数
malloc函数用于在堆区分配指定字节数的内存空间,它的原型如下:
void *malloc(size_t size);
size参数表示要分配的字节数,malloc函数返回一个指向分配内存起始地址的指针,如果分配失败,则返回NULL。
示例代码:
#include <stdio.h> #include <stdlib.h> int main() { int *arr; int n = 5; // 使用malloc分配内存空间 arr = (int *)malloc(n * sizeof(int)); if (arr == NULL) { printf("内存分配失败! "); return 1; } // 使用分配的内存空间 for (int i = 0; i < n; i++) { arr[i] = i + 1; } // 打印数组元素 for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } printf(" "); // 释放内存空间 free(arr); return 0; }
2、calloc函数
calloc函数用于在堆区分配指定字节数的内存空间,并将分配的内存空间初始化为0,它的原型如下:
void *calloc(size_t nmemb, size_t size);
nmemb参数表示要分配的元素个数,size参数表示每个元素的字节数,calloc函数返回一个指向分配内存起始地址的指针,如果分配失败,则返回NULL。
示例代码:
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char *str; int n = 5; // 使用calloc分配内存空间并初始化为0 str = (char *)calloc(n, sizeof(char)); if (str == NULL) { printf("内存分配失败! "); return 1; } // 使用分配的内存空间并修改字符串内容 strncpy(str, "Hello", n - 1); str[n - 1] = '\0'; // 确保字符串以'\0'结尾 printf("%s ", str); // 输出"Hello"(注意:最后一个字符是'\0') // 释放内存空间(不需要手动释放,因为calloc会自动处理) return 0; }
3、realloc函数
realloc函数用于重新分配内存空间,它可以调整已分配内存的大小,它的原型如下:
void *realloc(void *ptr, size_t size);
ptr参数表示要重新分配的内存起始地址,size参数表示新的字节数,realloc函数返回一个指向新内存起始地址的指针,如果分配失败,则返回NULL,如果成功,原来的内存空间将被释放,需要注意的是,当调整内存大小时,新内存的内容可能会被破坏,因此在调用realloc之后,需要检查返回值是否为NULL,以及是否需要重新赋值。
示例代码:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> // 用于检查断言是否成立(可选) int main() { int *arr; int n = 5; // 初始数组大小为5个整数(40字节) int m = 10; // 调整后的数组大小为10个整数(80字节) int temp[m]; // 临时数组用于存储原数组元素(可选) int i; // 循环计数器(可选) int j; // 循环计数器(可选) int k = 0; // 新数组下标(可选) int found = 0; // 查找原数组元素是否在新数组中的标记(可选) assert(n <= m); // 确保n不大于m(可选) assert(m % sizeof(int) == 0); // 确保m是整数倍(可选) assert(temp != NULL); // 确保临时数组不为空(可选) assert(k >= 0 && k <= m - n); // 确保k在有效范围内(可选) assert(found >= 0 && found <= n - 1); // 确保found在有效范围内(可选) // 使用realloc调整内存大小并复制元素到新数组中(可选) // 检查realloc是否成功(可选) if (realloc(arr, m * sizeof(int)) == NULL) { printf("内存重新分配失败! "); return 1; } // 使用新数组(可选) for (i = 0; i < m; i++) { if (!found) { temp[k++] = arr[i]; } else { temp[k++] = arr[i]; found--; } } // 释放原数组内存(可选) free(arr); // 将临时数组赋值给原数组(可选) arr = temp; // 打印新数组元素(可选) for (i = 0; i < m; i++) { printf("%d ", arr[i]); } printf(" "); return 0; } ```