推荐答案
// www.javascriptcn.com code example
#include <stdio.h>
#include <stdlib.h>
int main() {
int *arr;
int initial_size = 5;
// 分配初始内存
arr = (int *)malloc(initial_size * sizeof(int));
if (arr == NULL) {
printf("内存分配失败\n");
return 1;
}
// 初始化数组
for (int i = 0; i < initial_size; i++) {
arr[i] = i + 1;
}
// 扩展内存
int new_size = 10;
arr = (int *)realloc(arr, new_size * sizeof(int));
if (arr == NULL) {
printf("内存重新分配失败\n");
return 1;
}
// 初始化新增的内存
for (int i = initial_size; i < new_size; i++) {
arr[i] = i + 1;
}
// 打印数组
for (int i = 0; i < new_size; i++) {
printf("%d ", arr[i]);
}
printf("\n");
// 释放内存
free(arr);
return 0;
}本题详细解读
realloc 函数的基本用法
realloc 函数用于重新分配内存块的大小。它的原型如下:
void* realloc(void* ptr, size_t size);
ptr是指向之前分配的内存块的指针。如果ptr为NULL,realloc的行为与malloc相同,即分配一个新的内存块。size是新的内存块的大小,以字节为单位。如果size为 0,realloc会释放ptr指向的内存块,并返回NULL。
realloc 的工作原理
- 扩展内存:如果
realloc能够扩展当前内存块的大小,它会直接扩展并返回原来的指针。 - 重新分配内存:如果当前内存块无法扩展,
realloc会分配一个新的内存块,将旧内存块中的数据复制到新内存块中,然后释放旧内存块,并返回新内存块的指针。 - 释放内存:如果
size为 0,realloc会释放ptr指向的内存块,并返回NULL。
注意事项
- 内存泄漏:如果
realloc失败并返回NULL,原来的内存块不会被释放。因此,在使用realloc时,应该先将返回值赋给一个临时指针,检查是否为NULL,然后再更新原指针。 - 数据丢失:如果
realloc需要重新分配内存块,旧内存块中的数据会被复制到新内存块中。如果复制过程中发生错误,可能会导致数据丢失。
示例代码解析
在示例代码中,我们首先使用 malloc 分配了一个大小为 5 的整数数组。然后使用 realloc 将数组大小扩展到 10。最后,我们初始化并打印数组的内容,并释放内存。
通过这个示例,你可以看到 realloc 如何在不丢失原有数据的情况下扩展内存块的大小。