C语言中安全递增堆指针:偏移后指针重复释放是否合法?
这种操作完全不安全,属于未定义行为
你的代码存在两个触发未定义行为的严重问题:
传入非原始指针调用
free:free函数的规则很明确,只能传入malloc/calloc/realloc返回的原始指针,或者NULL。new_s = s+1是偏移后的指针,虽然指向同一块内存的内部,但内存分配器依赖原始指针定位内存块的元数据(比如块大小、管理标记等),偏移后的指针无法正确找到这些数据,调用free(new_s)会直接破坏堆结构,可能导致程序崩溃、内存泄漏,或是后续内存操作出现毫无征兆的异常。双重释放内存:就算
new_s是原始指针,连续调用free(s)和free(new_s)也属于双重释放——同一块内存被释放了两次,这本身就是未定义行为,会损坏堆结构,引发各种难以调试的问题。
正确的处理方式
如果需要对内存区域做“切片”访问,只需要保留好malloc返回的原始指针,用偏移后的指针读取或修改内存即可,仅需释放一次原始指针。修正后的示例代码如下:
#include <stdio.h> #include <string.h> #include <stdlib.h> int main() { char *s = (char*)malloc(256); strcpy(s, "Hello"); printf("%s\n", s); // Hello char *new_s = s+1; printf("%s\n", new_s); // ello // 仅释放原始指针一次 free(s); return 0; }
内容的提问来源于stack exchange,提问作者beep
相关产品推荐
相关产品推荐

