void genFNH(){
int fnh=0;
free(&fnh);
}
void genFUM1(){
int *fum=(int *)malloc(4*sizeof(int));
free(fum+1);
}
这两个函数的写法存在什么问题,主要从内存的角度考虑。
malloc(n)对外分配大小为n字节虚拟内存,返回其首指针。然malloc内部实际分配x+n字节,多余x字节位于n字节之前,其内数据记录该块内存的大小。x为常数,依赖于实现。
free(p)时,据p指针向前x字节,解析可得该内存大小等信息,free据此信息释放内存。
题主代码,未调用malloc而调用free。free(&fnh)强行将fnh地址传入。据常见内存结构,此地址之前x字节为栈数据,保存函数参数、返回地址等信息,free解析此x字节内存,将造成自fnh地址开始的若干字节内存释放,具体释放大小依赖于fnh地址之前x字节信息。通常此操作引起段错误,因fnh之后若干字节或未分配物理内存,或无权访问。
free(fum+1);与上同理,仅传入的指针不同。
3 回答1.3k 阅读✓ 已解决
1 回答1k 阅读✓ 已解决
4 回答813 阅读
1 回答886 阅读
1 回答916 阅读
1 回答686 阅读
1 回答791 阅读
第一个释放了栈上的内存,错误;
第二个释放释放内存地址错误。