c - free() : 无效指针以及如何重用当前释放的指针
问题描述
我想将我的指针指向另一个对象并释放前一个对象的内存。这就是我所做的,但我有一个无效的指针错误。正确的方法是什么?
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{
int number = 5;
int number2 = 10;
// Give memory manually
int *pointer2number = (int *) malloc(sizeof(int));
pointer2number = &number;
printf("Number is %i\n", number);
printf("Address of number is %p\n", pointer2number);
// Free memory
free(pointer2number);
pointer2number = (int *) malloc(sizeof(int));
pointer2number = &number2;
printf("New number is %i\n", *pointer2number);
return 0;
}
解决方案
int *pointer2number = (int *) malloc(sizeof(int));
pointer2number = &number;
您将地址分配给number
指针pointer2number
,并用它替换pointer2number
之前存储的已分配动态内存的地址。
第二次尝试也是如此number2
。
free()
任何对先前未由内存管理函数分配的内存的尝试都会调用未定义的行为:
" free 函数导致 ptr 指向的空间被释放,即可以用于进一步分配。如果 ptr 是空指针,则不执行任何操作。否则,如果参数与内存先前返回的指针不匹配管理函数,或者如果空间已通过调用 free 或 realloc 被释放,则行为未定义。 "
来源:ISO/IEC 9899:2018 (C18),第 7.22.3.3/2 节
并且作为副作用,之前分配的动态内存free()
也不是这样。
过度思考程序的逻辑!
推荐阅读
- json - Package json 中的配置对象
- python - Pandas-Dataframe Parallel Apply (Swifter, TQDM::process_map) 冻结?被叫时
- python - 如何下载 Azure Function (Python) .zip 文件?
- c++ - 在构造函数中相互引用的两个类
- ruby-on-rails - 如何使数据:{confirm..} 在 rails 6 中工作 | button_to
- gitlab - 错误:准备失败:获取 Kubernetes 配置:无效配置:未提供配置 Gitlab
- powershell - Powershell - 格式表删除列
- amazon-web-services - 如何加快 AWS Athena 分区重建?
- assembly - 有什么方法可以计算 emu8086 中的 x^y 吗?(x 是整数,y 是浮点数)
- javascript - 如何在服务器代码(Node)中指定静态文件(如JS、CSS、图片等)的路径?