void *malloc(size_t size);其中,size_t 是一个无符号整型,表示需要分配的内存空间大小,malloc 函数返回一个 void 类型的指针,指向分配的内存空间的首地址。
int n = 10; // 数组长度 int *arr = (int *)malloc(n * sizeof(int)); // 动态分配内存空间 for (int i = 0; i < n; i++) { arr[i] = i + 1; // 初始化数组元素 }在这个例子中,我们首先定义了一个整型变量 n,表示数组的长度。然后,使用 malloc 函数动态分配了 n 个 int 类型的内存空间,并将返回的指针类型强制转换成 int 类型的指针。接着,使用 for 循环初始化数组的每个元素。
for (int i = 0; i < n; i++) { printf("%d ", arr[i]); // 输出数组元素 }需要注意的是,动态数组的内存空间是在程序运行时动态分配的,所以在使用完后需要手动释放内存空间,避免造成内存泄漏。
void free(void *ptr);其中,ptr 是需要释放的内存空间的指针。例如:
free(arr); // 释放动态数组的内存空间需要注意的是,动态数组的内存空间只能使用一次 free 函数释放,多次释放会导致程序出错。另外,释放动态数组的内存空间后,指向数组的指针将成为“野指针”,不应再使用。
void *realloc(void *ptr, size_t size);其中,ptr 是需要重新分配内存空间的指针,size 表示需要重新分配的内存空间大小。如果重新分配成功,返回一个指向重新分配内存空间的指针;否则返回 NULL。
arr = (int *)realloc(arr, 2 * n * sizeof(int)); // 扩容为原来的两倍 for (int i = n; i < 2 * n; i++) { arr[i] = i + 1; // 初始化新增的数组元素 } n *= 2; // 更新数组长度在这个例子中,我们首先使用 realloc 函数将动态数组的长度扩大至原来的两倍,并重新分配内存空间。接着,使用 for 循环初始化新增的数组元素,然后更新数组长度。
arr = (int *)realloc(arr, n / 2 * sizeof(int)); // 缩容为原来的一半 n /= 2; // 更新数组长度在这个例子中,我们使用 realloc 函数将动态数组的长度缩小至原来的一半,并重新分配内存空间。接着,更新数组长度。
if (n >= capacity) { arr = (int *)realloc(arr, 2 * capacity * sizeof(int)); // 扩容为原来的两倍 capacity *= 2; // 更新数组容量 } for (int i = n - 1; i >= k; i--) { arr[i+1] = arr[i]; // 将元素后移一位 } arr[k] = x; // 插入新元素 n++; // 更新数组长度动态数组的删除操作类似,例如以下代码删除动态数组 arr 的第 k 个元素:
for (int i = k; i < n-1; i++) { arr[i] = arr[i+1]; // 将元素前移一位 } n--; // 更新数组长度 if (n < capacity / 2) { arr = (int *)realloc(arr, capacity / 2 * sizeof(int)); // 缩容为原来的一半 capacity /= 2; // 更新数组容量 }在这个例子中,我们从第 k 个元素开始,将后面的元素依次前移一位,然后更新数组长度。如果当前数组长度小于容量的一半,我们需要对数组进行缩容。
for (int i = 0; i < n; i++) { printf("%d ", arr[i]); }这段代码使用 for 循环遍历动态数组 arr 的所有元素,并将它们依次打印出来。
for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - i - 1; j++) { if (arr[j] > arr[j+1]) { int temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } }这段代码使用了冒泡排序算法,将动态数组 arr 中的元素按照从小到大的顺序重新排列。我们可以看到,冒泡排序的时间复杂度为 O(n^2),并不适合对大规模数据进行排序。
本文链接:http://task.lmcjl.com/news/13814.html