- 使用
realloc
重新分配内存:
#include <stdio.h>
#include <stdlib.h>
int main() {
int *ptr = (int *)malloc(10 * sizeof(int));
if (ptr == NULL) {
perror("malloc");
return 1;
}
// 对ptr指向的内存进行操作,例如赋值
for (int i = 0; i < 10; i++) {
ptr[i] = i;
}
// 使用realloc重新分配内存大小为20个int
int *new_ptr = (int *)realloc(ptr, 20 * sizeof(int));
if (new_ptr == NULL) {
perror("realloc");
free(ptr);
return 1;
}
ptr = new_ptr;
// 对新分配的内存部分进行操作,例如赋值
for (int i = 10; i < 20; i++) {
ptr[i] = i;
}
// 使用完后释放内存
free(ptr);
return 0;
}
- 可能出现的内存地址相关问题及预防:
- 内存泄漏:
- 产生原因:在使用
realloc
时,如果realloc
失败(返回NULL
),而我们没有释放原来malloc
分配的内存ptr
,就会导致内存泄漏。因为此时ptr
指向的内存无法再被访问和释放。
- 预防措施:如上述代码所示,在
realloc
失败时,及时调用free(ptr)
释放原来分配的内存。
- 悬空指针:
- 产生原因:如果在
realloc
成功后,忘记将ptr
更新为realloc
返回的新指针new_ptr
,当free(ptr)
被调用时,实际上释放的是旧的较小内存块,而之后如果继续使用ptr
,就会导致悬空指针问题。因为ptr
指向的内存已经被释放,而程序可能误以为它仍然指向有效的内存。
- 预防措施:在
realloc
成功后,将ptr
更新为realloc
返回的新指针,即ptr = new_ptr;
。这样后续对内存的操作和释放都是基于正确的指针。